一个JS程序员对机器学习的概念简单手记

为何要学习机器学习,我认为有如下重要的三点:git

  • 可缩短咱们的编程时间,好比能够经过机器学习学习垃圾话样本,进行更快速更精准的垃圾话的检测
  • 普通编程方法难以解决的问题,好比用户潜在喜爱和用户行为的预测
  • 更重要的是扩宽咱们程序员的思惟逻辑,对于适用的方向可以提出这方面的构思

从前JS程序员要学习机器学习,老是困难的,不少时候被算法和复杂的逻辑所困住,但如今问题获得很大的缓解,咱们能够用tensorflow.js(训练和部署机器语言模型的JavaScript库)提供的库和用更好的方式来更简单的实现机器学习能力。程序员

本文将主要讲解机器学习的一些主要概念。更偏重适用tensorflow.js的实战的入门级教程,请点击这里(前三节强烈推荐)github

基本的机器学习的流程通常是怎么样的

在学习机器学习前我认为首先要明确如下几点算法

  • 标签 通常来讲标签就是预测目标的结果,也能够是预测的正确值。
  • 特征 通常是指提提供训练的样本,而样本分如下几类:
    • 有标签的样本(带正确答案的样本,大部分都是使用有标签的样本进行训练)
    • 无标签的样本(不带正常答案的样本)
  • 模型 指的的是预测和训练样本的工具。你能够形象的理解为婴儿的大脑。
  • 损失函数 用于计算标签和模型预测值的差值。
  • 优化器 用于将损失函数计算的差值向正确方向优化的步伐
  • 学习速度 通常表明优化器的优化的步伐大小,过大则容易偏离正确值,太小则要更多运算才能到达正确值。就比如你要到马路中间要走5米,然而一次走500米和一次走5厘米,都很难到达马路中间。

好了,知道了以上几种概念,那么咱们来以一张图的方式来展现,机器究竟是如何进行学习的。编程

basic.png

那么从图中很容易了解到,咱们是将特征输入到模型中计算出预测值,将标签进行经过损失函数计算出偏差值,再交给优化器优化,参数更新后,模型再重复这一个过程,就构成了基本的机器学习的流程。网络

过拟合

为何要讲过拟合?什么是过拟合?机器学习

防止过拟合是分类器的一个核心任务。而好比人脸识别,实际上就是一个分类器,好比将图片的风景,动物脸,人脸中的人脸的特征进行归类,将欧美人脸,亚太人脸,非洲人脸进行归类,甚至能够将某个特定的人的脸单独归为一类。因此它在机器学习里面也有举足轻重的地位。函数

那什么是过拟合呢?举个例子,咱们在平常生活中见到的羊都是白色的,那有一天看到了除了颜色是黑色其余特征和咱们平常见到的白羊都是同样的,那咱们是否是就会认为这不是一只羊,人固然不会由于颜色就判定这不是一只羊,而机器却会说我见过的羊都是白色的,因此不可能有黑色的羊,因此这不是一只羊。过拟合官方的解释是为了获得一致假设而使假设变得过分严格。工具

那么过拟合要如何解决呢?这是一个机器学习重要的能力:泛化。学习

那么如何保证泛化,经验告诉咱们有3个要点:

  • 从分布中抽取独立同分布(iid)样本
  • 分布是平稳的不会随时间变化而变化
  • 始终从同一分布抽取样本

但样本的使用也一样重要,通常咱们会将样本分为 训练集,验证集,测试集。

各自用途是什么?为何须要分3个集?

用途是什么,这个问题很简单:

  • 训练集 用于训练模型
  • 验证集 用于评估模型,即在训练每轮后验证训练的准确性,并帮助矫正参数
  • 测试集 用于测试模型,验证模型的准确性

为何须要分3个集?可能你们会以为为何要三个集,直接用测试集评估和测试模型不就行了。

那咱们作一个假设。若是咱们用测试集评估模型,而后调整参数的话以下图:

error-train.png

那么会不会出现以前所说过拟合的问题呢?答案是会的。即为了获得一致假设而使假设变得过分严格,请仔细思考这句话。

而正确的方式应该是:

right-train.png

使用这样的流程就不会产生由于测试数据加入训练,致使经过了最终的测试数据中。

处理源数据的技巧

在训练模型以前咱们须要处理大量的源数据同时转换为咱们模型可使用的数据,那么源数据的处理技巧就相当重要了。

在将原始数据处理成特征的这个过程,咱们叫特征工程。

那么咱们在作特征工程时有什么技巧:

  • 字符串可使用独热编码
  • 过滤非合理数据,好比库中极少的数据
  • 筛选不随时间变化的特征
  • 使用分箱技巧处理非线性性特征

固然咱们在处理这类数据时,也应保持如下几点以更容易暴露有问题的数据:

  • 将数据可视化呈现
  • 不断地对数据进行调试
  • 对数据进行监控

讲了数据处理,咱们讲讲扩展数据集的方法,那么什么是扩展数据集呢?好比咱们的数据集不是很充足,好比只有10个,显然是不足以训练模型的数据集,目前最主流的方法是能够经过它的单一特征来实现扩展,好比都在某个城市出现过,这种是线性的扩展方式。可是 而对数据的处理中不少特征,不是经过简单的单一线性就能划分的特征,好比在某个城市出现过的且短时间存在的特征,这个就是非线性特征,咱们须要短时间存在和某个城市出现两个特征一块儿查询数据,这样的过程叫作特征交叉,即将两个数据交叉后转换为线性的方法。目前的事实也证实经过经过线性扩展数据是最高效的方法。(我的以为说特征交叉就高大上一点,而两个条件相交查询就不专业了)

如何让预测结果更加正常和正确评估模型

在以前说过咱们的模型训练须要经过损失函数计算损失,那么咱们如何下降更多的损失呢?就好比咱们训练集的损失度经过不断的学习愈来愈低,而测试集在训练集损失最低的时刻并不能是最低点,甚至说训练集样本损失度更高的时候,测试集损失度反而更低,咱们应该如何解决这个问题。让机器学习更好泛化到新样本中呢?

解决方案:

  • 早停法,能够简单理解为用测试集测试的损失度最低点时就中止训练的模型
  • 正则化

第一种方案在实际的操做中比较难控制,那么咱们今天主要来说讲主要使用的L2(岭回归)正则化,即如下几点。

  • 定义复杂度(模型)= 权重的平方和
  • 使用适当的权重
  • 对于线性模型:首选比较平缓的斜率
  • 贝叶斯先验几率:
    • 权重应该以 0 为中心
    • 权重应该呈正态分布

除L2正则化还存在L0正则化,L0正则化主要是解决:

  • 稀疏特征组合形成内存消耗过大
  • 噪点过多的问题

那么L0,和L2的区别是什么呢?即将权重设为0,处理稀疏特征组合数据。L10属于非凸优化问题。

那么L0可能过于暴力,会致使NP-hard的问题,但咱们还有一个折中的方案L1,即只对权重绝对值之和进行惩罚。同时L1属于凸优化问题。

一般咱们可使用逻辑回归结合一块儿使用

例如在求解几率的问题上,咱们可使用线性逻辑回归来快速求解问题,在非线性的状况,咱们可使用上节提到的特征交叉的方法来转换成线性再进行线性逻辑回归来快速求解问题,同时引入早停法和正则化来防止过拟合。

例如以前说过人脸识别其实是一个分类问题,咱们就可使用逻辑回归来判断分类几率,同时设置阈值来判断是否加入该分类,有时在这方面准确率产生也会产生误导性,如:

  • 在不一样类型的问题须要不一样的解决方案时
  • 分类不平衡,即正类别或负类别极其罕见时

解决分类不平衡,我以为咱们须要先了解下真正例和假正例,官方说的很好,我直接把这个狼来了的故事搬过来。

  • 真正例 咱们正确地提醒了狼的出现!咱们拯救了小镇。
  • 假正例 错误:咱们错误地提醒了狼的出现。全部人都对咱们很是生气。
  • 假负例 确实有一头狼出现了,但咱们没有发现它。狼吃光了咱们全部的鸡。
  • 假负例 没有狼出现,也没有提醒。你们都相安无事。

咱们能够把真正例,假正例,假负例,假负例组成不一样的指标

  • 精确率:(真正例次数)/(全部正类别预测次数)
  • 召回率:(真正例次数)/(全部实际正类别数)

精确率和召回率每每处于此消彼长的状态,精确率和召回率是模型的重要评估指标,但每每咱们没法直接得出精确率和召回率,因此可使用AUC(ROC曲线下方的面积大小)来解决这个问题,即随机挑选一个正样本以及一个负样本,当前的分类算法根据计算获得的Score值将这个正样本排在负样本前面的几率就是AUC值,而这个AUC值越高,模型就越好。

还有一个重要评估的指标是预测误差,即咱们全部预测项的总和和观察项的总和比较下的结果。但误差为0也并不能说明模型就完美,但预测误差是个很好的checklist项目。

深度神经网络

在处理源数据的技巧的小节上说到,对于非线性特征可使用特征交叉的方法来转换成线性特征来解决,但对于十分复杂的特征值,好比说真正例和假正例很接近,该如何处理呢?对的,可使用深度神经网络来解决这个问题。

对于线性问题,咱们的层级大概只有两层,即输入层和输出层

但对于非线性问题,咱们每每须要增长一些层,一般经过ReLU(线性整流函数)和BP(反向传播算法)来实现。

对于ReLU能够计算是否线性,通常来讲大于0则为线性问题

对于BP来讲,常见的方法有SGD(随机梯度降低法),算法由主要由两个阶段组成:激励传播与权重更新。

第1阶段:激励传播

每次迭代中的传播环节包含两步:

  • (前向传播阶段)将训练输入送入网络以得到激励响应;
  • (反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而得到隐藏层和输出层的响应偏差。

第2阶段:权重更新

对于每一个突触上的权重,按照如下步骤进行更新:

  • 将输入激励和响应偏差相乘,从而得到权重的梯度;
  • 将这个梯度乘上一个比例并取反后加到权重上。 这个比例(百分比)将会影响到训练过程的速度和效果,所以成为“训练因子”。梯度的方向指明了偏差扩大的方向,所以在更新权重的时候须要对其取反,从而减少权重引发的偏差。

第 1 和第 2 阶段能够反复循环迭代,直到网络对输入的响应达到满意的预约的目标范围为止。

注意事项:

  • 梯度很重要
    • 若是它是可微的,则咱们才可以对其进行学习
  • 梯度可能会消失
    • 每一个额外的层都会依次下降信噪比
    • ReLu 在这里颇有用
  • 梯度可能会分解(好比妈妈里面出现男,其实这在中国很常见)
    • 学习速率在这里很重要
    • 批标准化(实用按钮)能够提供帮助
  • ReLu 层可能会消失
    • 保持冷静,并下降您的学习速率

如何解决该问题,标准化特征值很重要

  • 特征具备合理的范围
    • 大体以 0 为中心,[-1, 1] 的范围一般效果比较好
    • 有助于梯度降低法收敛;避免 NaN 陷阱
    • 避免离群值也会有帮助
  • 可使用一些标准方法:
    • 线性缩放
    • 为最大值和最小值设定硬性上下限(截断)
    • 对数缩放

其次在深度神经网络里面还有一个颇有用的技巧,丢弃

  • 丢弃:另外一种正则化形式,对神经网络颇有用
  • 工做原理是,在一个梯度步长中随机“丢弃”网络的单元
    • 有一个可用于集成学习此处的模型的链接
  • 丢弃得越多,正则化效果就越强
    • 0.0(一点都不丢弃) = 无丢弃正则化,获得原来的复杂模型
    • 1.0 (所有丢弃) = 丢弃全部内容!学不到任何规律,获得特别简单且无用的模型
    • 中间值更有用(在这个位置进行丢弃,则是在这个位置应用了有效的正则化)

多类别神经网络

在以前的章节里面说到,逻辑回归很适合一些是或者不是的问题,它能够很方便给某样东西的是是或不是加上几率,好比是不是是垃圾邮件仍是非垃圾邮件。

但在多类别中,咱们是怎么处理的呢,即如何处理狗是哺乳动物?仍是植物?仍是其余什么?这种多分支选择。

那么咱们在一对多类别中,咱们能够:

  • 为每一个可能的类别建立惟一输出
  • 分别对“个人类别”与“全部其余类别”信号进行训练
  • 能够在深度网络中执行,也能够借助单独的模型执行

那咱们有没有更好,更方便的方法呢?对的,咱们可使用SoftMax进行多类别划分。SoftMax使得:

  • 添加了附加限制:要求全部一对多节点的输出总和为 1.0(100%,这就是逻辑回归的多类别升级版)
  • 附加限制有助于快速训练收敛
  • 另外,容许输出解析为几率

咱们可使用两种方式让SoftMax进行计算

  • 所有数据计算 即暴力破解;针对全部类别进行计算
  • 采样数据计算 即针对全部正类别标签进行计算,但仅针对负类别标签的随机样本进行计算。

那咱们应该如何使用标签给多类别分类呢?

多类别单一标签分类:

  • 一个样本可能只是一个类别的成员。
  • 类别互斥这一限制是有用的结构。
  • 有助于在损失中对此进行编码。
  • 将一个 softmax 损失用于全部可能的类别。

多类别多标签分类:

  • 一个样本多是多个类别的成员。
  • 无需对类别成员资格设定额外的限制。
  • 将一个逻辑回归损失用于每一个可能的类别。

类似性神经网络

这个在商品推荐和广告推荐比较经常使用。一般咱们须要在多维度分析用户来推荐对应商品:

  • 好比用户对商品的兴趣可大体从N个方面分析
  • 每部商品都变成一个点,在不一样的维度中,这个点的高度都是不同的
  • 那么咱们可从数据中嵌套学习,用户在不一样维度的兴趣点

在深度网络中学习嵌套能作什么?

  • 无需单独的训练过程,也就是说,嵌套层只是隐藏层,每一个维度一个单元
  • 监督式信息针对所需任务调整学到的嵌套,即根据用户上一个商品调整,下一个商品出现
  • 隐藏单元直观地发现整理多维空间中的各项,才能最大限度地优化最终目标

咱们可使用输入表示法来显示用户用户兴趣的相同特征

  • 每一个样本是用户兴趣的相同的特征的稀疏矢量
  • 使矩阵样本的密集表示法表示

好比

x 双肩包 沙发 冰箱 单肩包
x x v x x
x x x v x
用户 v x x v

那么用户的矩阵样本可表示为(1,0,0,1),但这种方法从空间和时间上来讲,这种表示法并不高效,由于每一个看过的商品都是一行,我这里只例举了双肩包,沙发,冰箱,单肩包。而正常来讲,用户看的远超这些。

咱们如何选择嵌套维度个数,请根据如下三条判断:

  • 嵌套维度的个数越多,越能准确地表示输入值之间的关系
  • 不过,维度个数越多,过拟合的可能性就越高,训练速度也会越慢
  • 经验法则

嵌套能作什么?

  • 嵌套会以类似内容彼此靠近的方式将各项内容(如影片、文字等)映射到低维实矢量
  • 嵌套也可应用于密集数据(如音频),以建立有意义的类似度指标
  • 联合嵌套多种类型的数据(如文字、图片、音频等),以定义这些数据之间的类似度

结语

为何要学习这些概念,我认为概念讲解每每比代码讲解更容易理解同样东西,代码也仅仅是概念的一种实现,概念能更好帮助咱们在后续的阶段更好的学习,欢迎查看tensorflow.js的实战的入门级教程学习更多实战内容。

相关文章
相关标签/搜索