为何要学习机器学习,我认为有如下重要的三点:git
从前JS程序员要学习机器学习,老是困难的,不少时候被算法和复杂的逻辑所困住,但如今问题获得很大的缓解,咱们能够用tensorflow.js(训练和部署机器语言模型的JavaScript库)提供的库和用更好的方式来更简单的实现机器学习能力。程序员
本文将主要讲解机器学习的一些主要概念。更偏重适用tensorflow.js的实战的入门级教程,请点击这里(前三节强烈推荐)。github
在学习机器学习前我认为首先要明确如下几点算法
好了,知道了以上几种概念,那么咱们来以一张图的方式来展现,机器究竟是如何进行学习的。编程
那么从图中很容易了解到,咱们是将特征输入到模型中计算出预测值,将标签进行经过损失函数计算出偏差值,再交给优化器优化,参数更新后,模型再重复这一个过程,就构成了基本的机器学习的流程。网络
为何要讲过拟合?什么是过拟合?机器学习
防止过拟合是分类器的一个核心任务。而好比人脸识别,实际上就是一个分类器,好比将图片的风景,动物脸,人脸中的人脸的特征进行归类,将欧美人脸,亚太人脸,非洲人脸进行归类,甚至能够将某个特定的人的脸单独归为一类。因此它在机器学习里面也有举足轻重的地位。函数
那什么是过拟合呢?举个例子,咱们在平常生活中见到的羊都是白色的,那有一天看到了除了颜色是黑色其余特征和咱们平常见到的白羊都是同样的,那咱们是否是就会认为这不是一只羊,人固然不会由于颜色就判定这不是一只羊,而机器却会说我见过的羊都是白色的,因此不可能有黑色的羊,因此这不是一只羊。过拟合官方的解释是为了获得一致假设而使假设变得过分严格。工具
那么过拟合要如何解决呢?这是一个机器学习重要的能力:泛化。学习
那么如何保证泛化,经验告诉咱们有3个要点:
独立同分布
(iid)样本平稳的
不会随时间变化而变化同一分布
抽取样本但样本的使用也一样重要,通常咱们会将样本分为 训练集,验证集,测试集。
各自用途是什么?为何须要分3个集?
用途是什么,这个问题很简单:
为何须要分3个集?可能你们会以为为何要三个集,直接用测试集评估和测试模型不就行了。
那咱们作一个假设。若是咱们用测试集评估模型,而后调整参数的话以下图:
那么会不会出现以前所说过拟合
的问题呢?答案是会的。即为了获得一致假设而使假设变得过分严格,请仔细思考这句话。
而正确的方式应该是:
使用这样的流程就不会产生由于测试数据加入训练,致使经过了最终的测试数据中。
在训练模型以前咱们须要处理大量的源数据同时转换为咱们模型可使用的数据,那么源数据的处理技巧就相当重要了。
在将原始数据处理成特征的这个过程,咱们叫特征工程。
那么咱们在作特征工程时有什么技巧:
固然咱们在处理这类数据时,也应保持如下几点以更容易暴露有问题的数据:
讲了数据处理,咱们讲讲扩展数据集的方法,那么什么是扩展数据集呢?好比咱们的数据集不是很充足,好比只有10个,显然是不足以训练模型的数据集,目前最主流的方法是能够经过它的单一特征来实现扩展,好比都在某个城市出现过,这种是线性的扩展方式。可是 而对数据的处理中不少特征,不是经过简单的单一线性就能划分的特征,好比在某个城市出现过的且短时间存在的特征,这个就是非线性特征,咱们须要短时间存在和某个城市出现两个特征一块儿查询数据,这样的过程叫作特征交叉,即将两个数据交叉后转换为线性的方法。目前的事实也证实经过经过线性扩展数据是最高效的方法。(我的以为说特征交叉就高大上一点,而两个条件相交查询就不专业了)
在以前说过咱们的模型训练须要经过损失函数计算损失,那么咱们如何下降更多的损失呢?就好比咱们训练集的损失度经过不断的学习愈来愈低,而测试集在训练集损失最低的时刻并不能是最低点,甚至说训练集样本损失度更高的时候,测试集损失度反而更低,咱们应该如何解决这个问题。让机器学习更好泛化到新样本中呢?
解决方案:
第一种方案在实际的操做中比较难控制,那么咱们今天主要来说讲主要使用的L2(岭回归)正则化,即如下几点。
除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 阶段能够反复循环迭代,直到网络对输入的响应达到满意的预约的目标范围为止。
注意事项:
如何解决该问题,标准化特征值很重要
其次在深度神经网络里面还有一个颇有用的技巧,丢弃
在以前的章节里面说到,逻辑回归很适合一些是或者不是的问题,它能够很方便给某样东西的是是或不是加上几率,好比是不是是垃圾邮件仍是非垃圾邮件。
但在多类别中,咱们是怎么处理的呢,即如何处理狗是哺乳动物?仍是植物?仍是其余什么?这种多分支选择。
那么咱们在一对多类别中,咱们能够:
那咱们有没有更好,更方便的方法呢?对的,咱们可使用SoftMax进行多类别划分。SoftMax使得:
咱们可使用两种方式让SoftMax进行计算
那咱们应该如何使用标签给多类别分类呢?
多类别单一标签分类:
多类别多标签分类:
这个在商品推荐和广告推荐比较经常使用。一般咱们须要在多维度分析用户来推荐对应商品:
在深度网络中学习嵌套能作什么?
咱们可使用输入表示法来显示用户用户兴趣的相同特征
好比
x | 双肩包 | 沙发 | 冰箱 | 单肩包 |
---|---|---|---|---|
x | x | v | x | x |
x | x | x | v | x |
用户 | v | x | x | v |
那么用户的矩阵样本可表示为(1,0,0,1),但这种方法从空间和时间上来讲,这种表示法并不高效,由于每一个看过的商品都是一行,我这里只例举了双肩包,沙发,冰箱,单肩包。而正常来讲,用户看的远超这些。
咱们如何选择嵌套维度个数,请根据如下三条判断:
嵌套能作什么?
为何要学习这些概念,我认为概念讲解每每比代码讲解更容易理解同样东西,代码也仅仅是概念的一种实现,概念能更好帮助咱们在后续的阶段更好的学习,欢迎查看tensorflow.js的实战的入门级教程学习更多实战内容。