Javascript 机器学习的四个层次

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。
来源: Alibaba F2E
作者:旭伦

image.png

Atwood定律说,凡是可以用Javascript实现的应用,最终都会用Javascript实现掉。作为最热门的机器学习领域,服务端是Python的主场,但是到了手机端呢?Android和iOS里默认都没有Python。但是有浏览器的地方就有js,现在还有个新场景 - 小程序。

除此之外,为了可以在不联网情况下进行训练的,也有支持本地框架比如React Native的。

可以说,只要有前端的地方,就有机器学习的框架在。

js唯一的问题在于,变化太快,每年都有很多新库出现,但是也有不少老的库宣布不维护了。但是,万变不离其宗,工具本身虽然经常有变化,但是它们的类型是非常稳定的。

选择机器学习工具的方法论

我们要写机器学习算法,需要什么样的工具呢?

机器学习工具可以分为以下四个层次:

image.png

层次一:直接服务于具体领域的框架

首先我们需要直接服务于具体领域的框架,比如处理CV的,NLP的,推荐算法之类的。

比如nlp.js,上一个版本发布在2020年10月。nlp.js的代码写起来是这样的:

const { NlpManager } = require('node-nlp');

const manager = new NlpManager({ languages: ['en'], forceNER: true });
// Adds the utterances and intents for the NLP
manager.addDocument('en', 'goodbye for now', 'greetings.bye');
manager.addDocument('en', 'bye bye take care', 'greetings.bye');
manager.addDocument('en', 'okay see you later', 'greetings.bye');
manager.addDocument('en', 'bye for now', 'greetings.bye');
manager.addDocument('en', 'i must go', 'greetings.bye');
manager.addDocument('en', 'hello', 'greetings.hello');
manager.addDocument('en', 'hi', 'greetings.hello');
manager.addDocument('en', 'howdy', 'greetings.hello');

// Train also the NLG
manager.addAnswer('en', 'greetings.bye', 'Till next time');
manager.addAnswer('en', 'greetings.bye', 'see you soon!');
manager.addAnswer('en', 'greetings.hello', 'Hey there!');
manager.addAnswer('en', 'greetings.hello', 'Greetings!');

// Train and save the model.
(async() => {
    await manager.train();
    manager.save();
    const response = await manager.process('en', 'I should go now');
    console.log(response);
})();

运行起来很简单,装个库就好:

npm install node-nlp

训练的速度也很快:

Epoch 1 loss 0.4629286907733636 time 1ms
Epoch 2 loss 0.2818764774939686 time 0ms
Epoch 3 loss 0.16872372018062168 time 0ms
Epoch 4 loss 0.11241683507408215 time 0ms
...
Epoch 31 loss 0.00004645272306535786 time 0ms

输出的结果类似这样:

{
  locale: 'en',
  utterance: 'I should go now',
  settings: undefined,
  languageGuessed: false,
  localeIso2: 'en',
  language: 'English',
  nluAnswer: {
    classifications: [ [Object] ],
    entities: undefined,
    explanation: undefined
  },
  classifications: [ { intent: 'greetings.bye', score: 1 } ],
  intent: 'greetings.bye',
  score: 1,
  domain: 'default',
  sourceEntities: [
    {
      start: 12,
      end: 14,
      resolution: [Object],
      text: 'now',
      typeName: 'datetimeV2.datetime'
    }
  ],
  entities: [
    {
      start: 12,
      end: 14,
      len: 3,
      accuracy: 0.95,
      sourceText: 'now',
      utteranceText: 'now',
      entity: 'datetime',
      resolution: [Object]
    }
  ],
  answers: [
    { answer: 'Till next time', opts: undefined },
    { answer: 'see you soon!', opts: undefined }
  ],
  answer: 'see you soon!',
  actions: [],
  sentiment: {
    score: 0.5,
    numWords: 4,
    numHits: 1,
    average: 0.125,
    type: 'senticon',
    locale: 'en',
    vote: 'positive'
  }
}

层次二:深度学习框架

第二是我们的核心内容,深度学习框架。

说到Javascript深度学习,占统治地位的仍然是Tensorflow.js,我们来看个经典的强化学习的例子:

image.png

使用浏览器的local storage和indexdb作为存储,边训练边展示训练效果的过程,很有前端的风范。

我们再看另一个大厂微软的例子,支持webGL和wasm,基于浏览器不容易:

image.png

另外需要强调的是,用于前端的框架并不是简单的把native或者python框架移植过来的,比如说它要处理兼容性的问题:

image.png

很多同学都对Tensorflow有一定了解,我们就手写一个网页,然后在其中调tf的API就好:

<!DOCTYPE html>
<html>
    <head>
        <meta encoding="UTF-8"/>
        <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.0.0/dist/tf.min.js"></script>
    </head>
    <body>
        <div id="tf-display"></div>
        <script>
            let a = tf.tensor1d([1.0]);
            let d1 = document.getElementById("tf-display");
            d1.innerText = a;
</script>
    </body>
</html>

层次三:机器学习框架

第三是机器学习的框架。光了解深度学习还不够,传统的机器学习在更贴近业务的时候,可能效果更好,还节省算力资源。比如可以使用mljs库,地址在:https://github.com/mljs/ml

比如我们想做个k-means聚类,可以使用mljs框架的ml-kmeans库:

const kmeans = require('ml-kmeans');

let data = [[1, 1, 1], [1, 2, 1], [-1, -1, -1], [-1, -1, -1.5]];
let centers = [[1, 2, 1], [-1, -1, -1]];

let ans = kmeans(data, 2, { initialization: centers });
console.log(ans);

装个包就可以玩了:

npm i ml-kmeans

运行结果如下:

KMeansResult {
  clusters: [ 0, 0, 1, 1 ],
  centroids: [
    { centroid: [Array], error: 0.25, size: 2 },
    { centroid: [Array], error: 0.0625, size: 2 }
  ],
  converged: true,
  iterations: 2,
  [Symbol(distance)]: [Function: squaredEuclidean]
}

我们也可以直接在网页中使用,比如我们写个K近邻的例子:

<!DOCTYPE html>
<html>
  <head>
    <meta encoding="UTF-8" />
    <script src="https://www.lactame.com/lib/ml/4.0.0/ml.min.js"></script>
  </head>
  <body>
    <div id="ml-display"></div>
    <script>
      const train_dataset = [
        [0, 0, 0],
        [0, 1, 1],
        [1, 1, 0],
        [2, 2, 2],
        [1, 2, 2],
        [2, 1, 2],
      ];
      const train_labels = [0, 0, 0, 1, 1, 1];
      let knn = new ML.KNN(train_dataset, train_labels, { k: 2 }); // consider 2 nearest neighbors

      const test_dataset = [
        [0.9, 0.9, 0.9],
        [1.1, 1.1, 1.1],
        [1.1, 1.1, 1.2],
        [1.2, 1.2, 1.2],
      ];

      let ans = knn.predict(test_dataset);

      let d1 = document.getElementById("ml-display");
      d1.innerText = ans;
</script>
  </body>
</html>

最后我们再来个决策树的例子,采用mljs自带的Iris数据集。需要通过npm安装下ml-dataset-iris和ml-cart:

const irisDataset = require('ml-dataset-iris');
const DecisionTreeClassifier = require('ml-cart');

const trainingSet = irisDataset.getNumbers();
const predictions = irisDataset
  .getClasses()
  .map((elem) => irisDataset.getDistinctClasses().indexOf(elem));

const options = {
  gainFunction: 'gini',
  maxDepth: 10,
  minNumSamples: 3,
};

const classifier = new DecisionTreeClassifier.DecisionTreeClassifier(options);
classifier.train(trainingSet, predictions);
const result = classifier.predict(trainingSet);

console.log(result);

输出结果如下:

[
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1,
  ... 50 more items
]

层次四:数学和统计库

第四个层次是数学和统计库。做统计和数学计算,很多时候才是理解业务的最好手段。这个时候我们也不能空手上,也需要工具。

我们先安装一下做后面的实验:

npm install @stdlib/stdlib

比如各种数学函数:

image.png

再比如各种随机分布:

image.png

我们以正态分布为例,看看stdlib是如何描述分布的:

const Normal = require( '@stdlib/stats/base/dists/normal' ).Normal;
let dist1 = new Normal( 0, 1 );
console.log(dist1);
let m1 = dist1.mean;
console.log(m1);
let v1 = dist1.variance;
console.log(v1);

构造Normal时的两个参数是均值和方差。

输出如下:

Normal { mu: [Getter/Setter], sigma: [Getter/Setter] }
0
1

这个无良的标准库竟然还支持50多种数据集,看个小例子,美国州首府的数据集:

const capitals = require( '@stdlib/datasets/us-states-capitals' );
const data_c = capitals();
console.log(data_c);

输出结果如下:

[
  'Montgomery',     'Juneau',         'Phoenix',
  'Little Rock',    'Sacramento',     'Denver',
  'Hartford',       'Dover',          'Tallahassee',
  'Atlanta',        'Honolulu',       'Boise',
  'Springfield',    'Indianapolis',   'Des Moines',
  'Topeka',         'Frankfort',      'Baton Rouge',
  'Augusta',        'Annapolis',      'Boston',
  'Lansing',        'Saint Paul',     'Jackson',
  'Jefferson City', 'Helena',         'Lincoln',
  'Carson City',    'Concord',        'Trenton',
  'Santa Fe',       'Albany',         'Raleigh',
  'Bismarck',       'Columbus',       'Oklahoma City',
  'Salem',          'Harrisburg',     'Providence',
  'Columbia',       'Pierre',         'Nashville',
  'Austin',         'Salt Lake City', 'Montpelier',
  'Richmond',       'Olympia',        'Charleston',
  'Madison',        'Cheyenne'
]

总结

综上,如果要做从0到1的业务,尽可能用第一层次的工具,这样最有助于快速落地。但是如果是要做增量,尤其是困难的增长,第三第四层次是首选,因为更有助于深刻理解数据。

f441bb4cf20944bda66ddae869a2c488.png

相关文章
|
2月前
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
83 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
2月前
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
503 1
|
4月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
54 1
|
4月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
84 0
|
7月前
|
机器学习/深度学习 JavaScript Python
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
183 0
|
7月前
|
机器学习/深度学习 自然语言处理 JavaScript
GEE机器学习——最大熵分类器案例分析(JavaScript和python代码)
GEE机器学习——最大熵分类器案例分析(JavaScript和python代码)
126 0
|
机器学习/深度学习 设计模式 JavaScript
|
JavaScript 前端开发
前端祖传三件套JavaScript的DOM之节点层次、类型、属性
随着互联网的不断发展,前端技术也在不断地更新迭代。但是,无论怎么更新变化,JavaScript、DOM、CSS 三件套的重要性始终不可替代。其中,JavaScript 的作用尤为关键。本文将聚焦于 JavaScript 中的 DOM,讨论节点层次、类型和属性等概念。
148 0
|
JavaScript
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)-2
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)
94 0
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)-2
|
JavaScript
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)-1
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)
210 0
JavaScript---网络编程(7)-Dom模型(节点间的层次关系,节点的增、删、改)-1