
虽然知道大多数同学都有资料收藏癖,还是给大家准备一份自然语言处理学习大礼包,其实是之前陆陆续续分享的NLP学习资源,包括自然语言处理、深度学习、机器学习、数学相关的经典课程、书籍和学习笔记,这些资料基本上都是公开渠道可以获得的,整理到一起,方便NLP爱好者收藏把玩。当然,学习的前提依然是”学自然语言处理,其实更应该学好英语“。
获取方法很简单,关注AINLP公众号,后台回复关键词:ALL4NLP,一键打包收藏NLP学习资源: 继续阅读
虽然知道大多数同学都有资料收藏癖,还是给大家准备一份自然语言处理学习大礼包,其实是之前陆陆续续分享的NLP学习资源,包括自然语言处理、深度学习、机器学习、数学相关的经典课程、书籍和学习笔记,这些资料基本上都是公开渠道可以获得的,整理到一起,方便NLP爱好者收藏把玩。当然,学习的前提依然是”学自然语言处理,其实更应该学好英语“。
获取方法很简单,关注AINLP公众号,后台回复关键词:ALL4NLP,一键打包收藏NLP学习资源: 继续阅读
斯坦福大学机器学习斯坦福大学机器学习第十一课“机器学习系统设计(Machine learning system design)””学习笔记,本次课程主要包括5部分:
1) Prioritizing what to work on: Spam classification example(工作的优先级:垃圾邮件分类例子)
2) Error analysis(错误分析)
3) Error metrics for skewed classes(不对称性分类的错误评估)
4) Trading off precision and recall(精确度和召回率的权衡)
5) Data for machine learning(数据对于机器学习的重要性)
以下是每一部分的详细解读。
1) Prioritizing what to work on: Spam classification example(工作的优先级:垃圾邮件分类例子)
首先让我们来看一下垃圾邮件和非垃圾邮件的例子,以下是一个垃圾邮件示例:
我们将其标注为“垃圾(spam)", 用1表示;以下是一个非垃圾邮件的例子:
我们将其标注为“非垃圾(non-spam)",用0表示。
如果我们有一些这样标注好的垃圾和非垃圾邮件样本,如何来训练一个垃圾邮件分类器?很清楚这是一个有监督学习的问题,假设我们选择逻辑回归算法来训练这样的分类器,首先必须选择合适的特征。这里定义:
x = 邮件的特征;
y = 垃圾邮件(1) 或 非垃圾邮件(0)
我们可以选择100个典型的词汇集合来代表垃圾/非垃圾(单词),例如deal, buy, discount, andrew, now等,可以按它们的字母顺序排序。对于已经标注好的邮件训练样本,如果100个词汇中有单词j在样本中出现,就用1代表特征向量x中的xj,否则用0表示,这样训练样本就被特征向量x所替代:
注意在实际使用中,我们不会手动去选择100个典型的词汇,而是从训练集中选择出现频率最高的前n个词,例如10000到50000个。
那么,如何高效的训练一个垃圾邮件分类器使其准确率较高,错误率较小?
- 首先很自然的考虑到收集较多的数据,例如"honeypot" project,一个专门收集垃圾邮件服务器ip和垃圾邮件内容的项目;
- 但是上一章已经告诉我们,数据并不是越多越好,所以可以考虑设计其他复杂的特征,例如利用邮件的发送信息,这通常隐藏在垃圾邮件的顶部;
- 还可以考虑设计基于邮件主体的特征,例如是否将"discount"和"discounts"看作是同一个词?同理如何处理"deal"和"Dealer"? 还有是否将标点作为特征?
- 最后可以考虑使用复杂的算法来侦测错误的拼写(垃圾邮件会故意将单词拼写错误以逃避垃圾邮件过滤器,例如m0rtgage, med1cine, w4tches)
2) Error analysis(错误分析)
在我们需要机器学习算法来解决一些实际问题时,建议:
假设交叉验证集上有500个邮件样本,其中算法错分了100个邮件,那么我们就人工来检查这100个bad case, 并且按如下的方式对它们进行分类:
数值评估的重要性:
在对bad case进行分析后,我们可能会考虑如下的方法:
错误分析不能决定上述方法是否有效,它只是提供了一种解决问题的思路和参考,只有在实际的尝试后才能看出这些方法是否有效。
所以我们需要对算法进行数值评估(例如交叉验证集误差),来看看使用或不使用某种方法时的算法效果,例如:
3) Error metrics for skewed classes(不对称性分类的错误评估)
什么是不对称性分类?
以癌症预测或者分类为例,我们训练了一个逻辑回归模型. 如果是癌症,y = 1, 其他则 y = 0。
在测试集上发现这个模型的错误率仅为1%(99%都分正确了),貌似是一个非常好的结果?
但事实上,仅有0.5%的病人得了癌症,如果我们不用任何学习算法,对于测试集中的所有人都预测y = 0,既没有癌症:
那么这个预测方法的错误率仅为0.5%,比我们废好大力训练的逻辑回归模型的还要好。这就是一个不对称分类的例子,对于这样的例子,仅仅考虑错误率是有风险的。
现在我们就来考虑一种标准的衡量方法:Precision/Recall(精确度和召回率)
首先对正例和负例做如下的定义:
其中:
True Positive (真正例, TP)被模型预测为正的正样本;可以称作判断为真的正确率
True Negative(真负例 , TN)被模型预测为负的负样本 ;可以称作判断为假的正确率
False Positive (假正例, FP)被模型预测为正的负样本;可以称作误报率
False Negative(假负例 , FN)被模型预测为负的正样本;可以称作漏报率
那么对于癌症预测这个例子我们可以定义:
Precision-预测中实际得癌症的病人数量(真正例)除以我们预测的得癌症的病人数量:
Recall-预测中实际得癌症的病人数量(真正例)除以实际得癌症的病人数量:
4) Trading off precision and recall(精确度和召回率的权衡)
假设我们的分类器使用了逻辑回归模型,预测值在0到1之间:, 一种通常的判断正负例的方法是设置一个阈值,例如0.5:
这个时候,我们就可以计算这个分类器的precision and recall(精确度和召回率):
这个时候,不同的阈值回导致不同的精确度和召回率,那么如何来权衡这二值?对于癌症预测这个例子:
假设我们非常有把握时才预测病人得癌症(y=1), 这个时候,我们常常将阈值设置的很高,这会导致高精确度,低召回率(Higher precision, lower recall);
假设我们不希望将太多的癌症例子错分(避免假负例,本身得了癌症,确被分类为没有得癌症), 这个时候,阈值就可以设置的低一些,这又会导致高召回率,低精确度(Higher recall, lower precision);
这些问题,可以归结到一张Precision Recall曲线,简称PR-Curve:
那么如何来比较不同的Precison/Recall值呢?例如,对于下表:
通常我们会考虑用它们的均值来做比较,但是这会引入一个问题,例如上面三组Precision/Recall的均值分别是:0.45, 0.4, 0.51,最后一组最好,但是最后一组真的好吗?如果我们将阈值定的很低,甚至为0, 那么对于所有的测试集,我们的预测都是y = 1, 那么recall 就是1.0,我们根本就不需要什么复杂的机器学习算法,直接预测y = 1就得了,所以,用Precison/Recall的均值不是一个好办法。
现在我们引入标准的F值或者F1-score:
F值是对精确度和召回率的一个很好的权衡,两种极端的情况也能很好的平衡:
5) Data for machine learning(数据对于机器学习的重要性)
在设计一个高准确率的机器学习系统时,数据具有多大的意义? 2001年的时候,Banko and Brill曾做了一个实验,对易混淆的单词进行分类,也就是在一个句子的上下文环境中选择一个合适的单词,例如:
For breakfast I ate ___ eggs
给定{to, two, too},选择一个合适的单词。
他们用了如下几种机器学习算法:
根据训练集的不同规模记录这几种算法的准确率,并且做了如下的图:
最终得到的结论是:
“It's not who has the best algorithm that wins. It's who has the most data."
选择大数据的理由?
假设我们的特征 有很多的信息来准确的预测y, 例如,上面的易混淆词分类的例子,它有整个句子的上下文可以利用;
反过来,例如预测房价的时候,如果仅有房屋大小这个特征,没有其他的特征,能预测准确吗?
对于这样的问题,一种简单的测试方法是给定这样的特征,一个人类专家能否准确的预测出y?
如果一个学习算法有很多的参数,例如逻辑回归/线性回归有很多的特征,神经网络有很多隐藏的单元,那么它的训练集误差将会很小,但容易陷入过拟合;如果再使用很大的训练数据,那么它将很难过拟合,它的训练集误差和测试集误差将会近似相等,并且很小。所以大数据对于机器学习还是非常重要的。
参考资料:
机器学习视频可以在Coursera机器学习课程上观看或下载: https://class.coursera.org/ml
http://en.wikipedia.org/wiki/Precision_and_recall
http://en.wikipedia.org/wiki/Accuracy_and_precision
召回率 Recall、精确度Precision、准确率Accuracy、虚警、漏警等分类判定指标
True(False) Positives (Negatives)
http://en.wikipedia.org/wiki/F1_score
本系列文章来自我在52opencourse上发布的笔记,这里做个备份,转载请注明出处:
http://52opencourse.com/275/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D%A6%E7%A6%8F%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%AC%E5%8D%81%E4%B8%80%E8%AF%BE-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1-machine-learning-system-design
斯坦福大学机器学习斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”学习笔记,本次课程主要包括7部分:
1) Deciding what to try next(决定下一步该如何做)
2) Evaluating a hypothesis(评估假设)
3) Model selection and training/validation/test sets(模型选择和训练/验证/测试集)
4) Diagnosing bias vs. variance(诊断偏差和方差)
5) Regularization and bias/variance(正则化和偏差/方差)
6) Learning curves(学习曲线)
7) Deciding what to try next (revisited)(再次决定下一步该做什么)
以下是每一部分的详细解读。
1) Deciding what to try next(决定下一步该如何做)
对学习算法进行调试:
假设你实现了一个正则化的线性回归算法来预测房价:
然而,当你用它来测试一批新的房屋数据时,发现预测出来的数据是很不准确的,那么,下一步你该干啥?以下提供一些选项,但是暂时不过多解释,当我们学完这一章时,就知道选择这些选项的依据了。
- 获取更多的训练样本
- 尝试使用更少的特征的集合
- 尝试获得其他特征
- 尝试添加多项组合特征
- 尝试减小
- 尝试增加
机器学习(算法)诊断(Diagnostic)是一种测试方法,使你能对一种学习算法进行深入的认识,知道什么能运行,什么不能运行,并且能指导你如何最大限度的提高学习算法的性能。
诊断测试虽然需要一些时间来实现,但是这样做可以更有效的利用你的时间。
2) Evaluating a hypothesis(评估假设)
在房价预测问题中,如果Hypotheis如下:
定义了如下的特征:
并且对训练数据做了非常好的拟合:
但是对不在训练集的新数据的预测的很差,失去通用性,那么,我们该如何评估这个假设?
首先,我们需要将数据集进行切分,一部分(例如70%)作为训练集,另一部分(例如30%)作为测试集:
对于线性回归来说:
- 通过最小化训练集的error 来学习参数
;
- 再计算测试集的error:
对于逻辑回归来说,与线性回归相似:
-首先从训练集中学习参数;
-计算测试集的error:
-额外再加一个错误分类的error(或者称为0/1错误分类error);
3) Model selection and training/validation/test sets(模型选择和训练/验证/测试集)
首先让我们来回顾上面那个过拟合的例子:
一旦参数对于某些数据集(训练集)适应(最终学习的参数),那么基于该数据及参数所计算的模型的error(训练误差
很可能比实践泛化的error要小。
所以我们需要考虑一下模型选择(Model Selection)的问题,首先来看一个选择多项式回归模型的例子,我们有1-10次方的多项式回归模型,或者hypothesis:
如何选择模型?
这里我们首先基于训练集学习参数,然后计算测试集的error, 最后选择测试集error最小的多项式回归模型,例如这里我们选择:
那么这个模型的泛化能力如何?测试集的error 基本能代表它的泛化能力,但是这是否准确?
我们用测试集来选择参数,然后有用测试集来评估假设(hypothesis), 看起来这样的评估是基于测试集进行了优化的?
的确存在一点问题,所以,这里我们再引入第三个集合:交叉验证集,我们用它来选择参数,而仅仅在测试集上评估假设。
对于原始的数据集,一种比较典型的划分方式是60%的训练集,20%的交叉验证集以及20%的测试集:
有了这三个数据集合,我们也可以分别定义它们各自的error:
但是在实际使用时,我们通过训练集学习到参数, 再计算交叉验证集上的error, 再选择一个在验证集上error最小的模型,最后再在测试集上估计模型的泛化误差(error):
4) Diagnosing bias vs. variance(诊断偏差和方差)
首先看一下偏差和方差的例子,这些例子和正则化那一章的例子相同,不过同时被贴上了偏差或方差的标签:
a) 高偏差(欠拟合):
b) 高方差(过拟合):
c) 合适的拟合:
我们来计算这三个模型的train error和cross validation error:
我们会发现:
当多项式回归模型的次数d=1,也就是高偏差(欠拟合)时,训练集误差和验证集误差都比较大;
当d=4, 也就是高方差(过拟合)时,训练集误差会很小(拟合的非常好),但是验证集误差却很大;
当d=2,也就是拟合的刚刚好时,无论训练集误差还是验证集误差都刚刚好,介于上面两者之间。
如果用图形表示,就是下面这个样子:
有了上面的解释,我们就可以来诊断偏差还是方差的问题了。假设你的学习算法表现的不尽如人意,没有达到你的期望,如何来判定它是一个偏差的问题还是方差的问题?我们可以计算他们的训练集误差和交叉验证集误差,如果它们落入了上图的“头部”区域,可以判断是偏差(欠拟合)问题,如果落入了“尾部”区域,可以判断是方差(过拟合)问题,如下图所示:
最后,对于偏差还是方差的问题,可以做一个总结如下:
5) Regularization and bias/variance(正则化和偏差/方差)
对于过拟合问题,正则化是一个非常有效的解决方案,所以这一小节我们将考虑正则化和偏差/方差的关系。首先来看一个正则化的线性回归的例子:
如果正则化参数过大,一种极端的情况例如
= 10000, 那么除去
,所学的其他参数都将近似为0,这就是欠拟合或高偏差的情况:
如果过小,极端的情况是
= 0,等于没有对线性回归模型进行正则化,那么过拟合高方差的问题就很容易出现:
如果选取的比较合适,介于上述二者之间,那么我们将得到合适的拟合:
那么,如何选择正则化参数 ?
对于数据集,我们仍将它划为3份:训练集,验证集,测试集。对于给定的正则化模型,例如上面的例子,我们按 从小到大的顺序依次取数,然后在训练集上学习模型参数,在交叉验证集上计算验证集误差,并选择误差最小的模型, 也就是选择
,最后再在测试集上评估假设:
偏差/方差可以作为正则化参数 的函数,与上一小节相似,我们也可以画出这个函数图,这样我们就能评估
合适的选择范围了:
6) Learning curves(学习曲线)
这一小节考虑Learning curves(学习曲线)的问题,主要针对的是训练样本数目来观察训练集误差和验证集误差之间的差异:
以下来考虑训练样本数目和模型的关系。以二次项多项式回归为例,如果仅有一个训练样本,那么模型很容易和样本点拟合,训练集误差近似为0,几乎可以忽略不计,而验证集误差可能会很大;如果有两个样本点,模型也很容易拟合样本点,训练集误差会略大一点,验证集误差可能会小一些;以此类推,当样本点比较多时,模型虽然不能拟合所有的样本点,但是泛化能力会更好一些,因此训练集误差会更大一点,而验证集误差会更小一些,如下图所示:
而误差和训练样本数目m的关系或者学习曲线如下:
以下通过学习曲线来考虑高偏差和高方差的问题。对于高偏差欠拟合问题:
即使增大了训练样本数目,模型拟合的依然不够,依然还是欠拟合问题。以下是高偏差欠拟合问题的学习曲线:
我们发现,如果一个学习算法是高偏差的,那么它的训练误差和验证集误差在一定的训练样本数目之后都很高,而且不会随着样本数目的增大而改变,所以对于高偏差欠拟合的问题,增加训练样本数目不是一个好的解决办法。
而对于高方差过拟合问题:
增大样本数目后,模型的泛化能力会好一些,一些是高方差过拟合问题的学习曲线:
我们发现,如果一个学习算法是高方差的,那么它的训练误差和验证集误差在一定的训练样本数目之后虽然有差异,但是会随着样本数目的增大而减小她们之间的gap,所以对于高方差过拟合的问题,增加训练样本数目是解决方法之一。
7) Deciding what to try next (revisited)(再次决定下一步该做什么)
好了,说完了这么多与偏差/方差有关的问题,我们再次回到本章的开头的问题,
假设你实现了一个正则化的线性回归算法来预测房价,然而当你用它来测试一批新的房屋数据时,发现预测出来的数据是很不准确的,那么,下一步你该干啥?以下这些选项,分别针对的是高方差或高偏差的问题,你可以尝试用上述小节的一些方法来诊断你的学习算法,不过对于下述选项,需要你考虑一下是针对高偏差还是方差的问题,可以先思考一分钟再看答案:
- 获取更多的训练样本
- 尝试使用更少的特征的集合
- 尝试获得其他特征
- 尝试添加多项组合特征
- 尝试减小
- 尝试增加
答案:
- 获取更多的训练样本 - 解决高方差
- 尝试使用更少的特征的集合 - 解决高方差
- 尝试获得其他特征 - 解决高偏差
- 尝试添加多项组合特征 - 解决高偏差
- 尝试减小 - 解决高偏差
- 尝试增加 -解决高方差
最后我们再来看一下神经网络和过拟合的问题:
以下是“小”的神经网络(参数比较少,很容易欠拟合):
它的计算代价较少。
以下是“大”的神经网络(参数比较多,很容易过拟合):
它的计算代价较大,对于神经网络过拟合的问题,可以通过正则化()方法解决。
参考资料:
机器学习视频可以在Coursera机器学习课程上观看或下载: https://class.coursera.org/ml
Mitchell教授的经典书籍《机器学习》
李航博士《统计学习方法》
斯坦福大学机器学习斯坦福大学机器学习第九课“神经网络的学习(Neural Networks: Learning)”学习笔记,本次课程主要包括8部分:
1) Cost function(代价函数)
2) Backpropagation algorithm(BP算法 or 反向传播算法)
3) Backpropagation intuition(BP算法的直观解释)
4) Implementation note: Unrolling parameters(实现时的注意点:展开参数)
5) Gradient checking(梯度下降算法的验证)
6) Random initialization(随机初始化)
7) Putting it together(组合到一起-如何训练一个神经网络)
8) Backpropagation example: Autonomous driving (optional)(BP算法的例子-无人驾驶汽车)
以下是每一部分的详细解读。
1) Cost function(代价函数)
首先回顾一下神经网络的结构:
其中:
训练集是:
L = 神经网络的层数
= 第l层的单元个数(不包括偏置单元)
对于一个分类问题来说:
如果是一个二类分类(Binary classification),那么y = 0 或1,在神经网络的输出层上只有一个输出单元;
如果是一个多类分类(Multi-class classification), 那么
在神经网络的输出层上有K个输出单元。
Cost function:
在逻辑回归中,Cost Function的定义相对简单,如下所示:
由于神经网络的输出层通常有多个输出,属于k维向量,因此用如下的方式定义神经网络的Cost function:
注意,对于训练集的每一个样本,都需要对输出层所有的输出单元计算cost并求和。
2) Backpropagation algorithm(BP算法 or 反向传播算法)
和线性回归或逻辑回归相似,求取神经网络的参数也可以采用梯度下降算法,但是和它们二者略微不同的是,神经网络相对复杂,如果计算它的梯度?
我们知道,神经网络的Cost function是:
目标是最小化Cost function:
我们需要通过如下两个式子来计算梯度:
在上一课“神经网络的表示”里,我们给出了前馈网络的计算方法(向量化实现),对于一个给定训练样本(x, y)的神经网络,首先通过“前向传播”的方式从输入层开始计算神经网络的每一层表示,直到输出层。例如对于如下的4层神经网络:
计算的方法如下:
有了神经网络的“表示”,如何计算梯度?这个时候,我们引入反向传播算法,简称BP算法。反向算法的核心是最小化网络输出值和目标值之间的“误差”,所以这里首先引入一个关于误差的记号:
= l 层 j 节点的误差(error)
对于神经网络输出层的单元来说,例如上例中的第4层,误差的计算比较直观:
但是对于隐藏层的误差计算,就不那么直观了:
注:有志于弄清楚为什么的同学可以参考Mitchell教授的经典书籍《机器学习》的第四章“人工神经网络”,有详细的说明。
现在我们可以给出一个完成的BP算法,至于BP算法的一些解释和说明,将会在之后的小节给出:
我们需要计算每个节点的梯度,这里通过反向传播算法达到了。
补充:关于前馈网络和BP神经网络的关系,可以参考这篇文章中的解释:
我们最常用的神经网络就是BP网络,也叫多层前馈网络。BP是back propagation的所写,是反向传播的意思。我以前比较糊涂,因为一直不理解为啥一会叫前馈网络,一会叫BP(反向传播)网络,不是矛盾吗?其实是 这样的,前馈是从网络结构上来说的,是前一层神经元单向馈入后一层神经元,而后面的神经元没有反馈到之前的神经元;而BP网络是从网络的训练方法上来说 的,是指该网络的训练算法是反向传播算法,即神经元的链接权重的训练是从最后一层(输出层)开始,然后反向依次更新前一层的链接权重。因此二者并不矛盾, 只是我没有理解其精髓而已。
随便提一下BP网络的强大威力:
1)任何的布尔函数都可以由两层单元的网络准确表示,但是所需的隐藏层神经元的数量随网络输入数量呈指数级增长;
2)任意连续函数都可由一个两层的网络以任意精度逼近。这里的两层网络是指隐藏层使用sigmoid单元、输出层使用非阈值的线性单元;
3)任意函数都可由一个三层的网络以任意精度逼近。其两层隐藏层使用sigmoid单元、输出层使用非阈值的线性单元。【注】参考自《机器学习》
3) Backpropagation intuition(BP算法的直观解释)
相对于线性回归或逻辑回归来说,BP算法不是很简洁和清晰,这一小节将解释神经网络BP算法的一些步骤,希望对大家直观的了解BP算法有一些帮助。不过Andrew Ng教授也说了:
And even though, you know, I have used back prop for many years, sometimes it's a difficult algorithm to understand.
首先从前向传播说起,下面是一个前馈神经网络的例子:
对于这个神经网络来说,它有4层,除了输出层只有1个单元外,其他每层都有2个单元(除去偏置单元)。对于一个训练样本来说,可以通过前向传播的方式计算各个相关单元,如下图所示:
那么反向传播到底在做什么?首先简化神经网络的代价函数:
我们仅关注一个样本\lambda = 0), 这样Cost function可以简化为如下的形式:
那么对于样本i, BP算法在神经网络上是如何生效的? 如果记
= l 层 j 节点
的cost的误差(error)
其中:
BP算法主要是从输出层反向计算各个节点的误差的,故称之为反向传播算法,对于上例,计算的过程如下图所示:
注:这里有些细节没有详细描述,具体的可参考视频课程或者Mitchell教授的经典书籍《机器学习》的第四章“人工神经网络”。
4) Implementation note: Unrolling parameters(实现时的注意点:展开参数)
本节主要讲的是利用octave实现神经网络算法的一个小技巧:将多个参数矩阵展开为一个向量。具体可以参考课程视频,此处略。
5) Gradient checking(梯度下降算法的验证)
神经网络算法是一个很复杂的算法,所以有必要在实现的时候做一些检查,本节给出一个检验梯度的数值化方法。
关于梯度,有一种比较简便的数值估计方法,例如,对于一元参数来说:
可以用如下公式近似估计梯度:
其中 取较小的值。
同理,对于多元参数或参数向量来说,上述方法同样适用:
我们的主要目标是检查这个梯度的近似向量与反向传播算法得到的梯度向量是否近似相等:
实现时的注意点:
特别重要的是:
6) Random initialization(随机初始化)
关于如何学习一个神经网络的细节到目前为止基本说完了,不过还有一点需要注意,就是如何初始化参数向量or矩阵。通常情况下,我们会将参数全部初始化为0,这对于很多问题是足够的,但是对于神经网络算法,会存在一些问题,以下将会详细的介绍。
对于梯度下降和其他优化算法,对于参数向量的初始化是必不可少的。能不能将初始化的参数全部设置为0:
在神经网络中:
如果将参数全部初始化为0:
会导致一个问题,例如对于上面的神经网络的例子,如果将参数全部初始化为0,在每轮参数更新的时候,与输入单元相关的两个隐藏单元的结果将是相同的,既:
这个问题又称之为对称的权重问题,因此我们需要打破这种对称,这里提供一种随机初始化参数向量的方法: 初始化 为一个落在 [
]区间内的随机数,
可以很小,但是与梯度检验中的
没有任何关系。
7) Putting it together(组合到一起-如何训练一个神经网络)
关于神经网络的训练,我们已经谈到了很多,现在是时候将它们组合到一起了。那么,如何训练一个神经网络?
首先需要确定一个神经网络的结构-神经元的连接模式, 包括:
在确定好神经网络的结构后,我们按如下的步骤训练神经网络:
1. 随机初始化权重参数;
2. 实现:对于每一个 通过前向传播得到
;
3. 实现:计算代价函数;
4. 实现:反向传播算法用于计算偏导数
5. 使用梯度检查来比较反向传播算法计算的和数值估计的
的梯度,如果没有问题,在实际训练时关闭这部分代码;
6. 在反向传播的基础上使用梯度下降或其他优化算法来最小化;
8) Backpropagation example: Autonomous driving (optional)(BP算法的例子-无人驾驶汽车)
关于通过神经网络来实现一个无人驾驶汽车的例子,请大家参考课程视频,此处略。
参考资料:
机器学习视频可以在Coursera机器学习课程上观看或下载: https://class.coursera.org/ml
http://en.wikipedia.org/wiki/Backpropagation
Mitchell教授的经典书籍《机器学习》
斯坦福大学机器学习第八课“神经网络的表示(Neural Networks: Representation)”学习笔记,本次课程主要包括7部分:
1) Non-linear hypotheses (非线性hypotheses)
2) Neurons and the brain (神经元和大脑)
3) Model representation I (模型表示一)
4) Model representation II (模型表示二)
5) Examples and intuitions I (例子和直观解释一)
6) Examples and intuitions II (例子和直观解释二)
7) Multi-class classification (多类分类问题)
以下是每一部分的详细解读。
1) Non-linear hypotheses (非线性hypotheses)
非线性分类器:
我们之前谈过线性回归,逻辑回归,当我们遇到一些比较复杂的分类问题时,是否还有其他选择?例如,对于多项式回归:
可以得到如下的非线性分类器:
假设这是一个房价预测问题,不过这一次不再是预测房价(回归问题),而是预测未来6个月是否能售出(分类问题)。如果有100个独立特征,例如:
那么,当我们任取两个特征作为组合特征时,大约可以得到5000个特征();当我们任取3个特征作为组合特征时,大约可以得到170000(
)个特征.
这样的问题还有很多,例如在计算机视觉的汽车检测问题中,对于一副汽车图片来说,你可以轻易的辨别出这是一辆汽车,但是在计算机或者相机“眼里”,这只是一堆像素的数字矩阵而已:
所以,对于汽车检测问题,我们需要一堆汽车图片:
和一堆非汽车图片作为训练集:
训练一个用于汽车检测的分类器,对于一个测试图片,判断是否是汽车:
一种方法是从每辆汽车是取两个像素点作为样本的特征,然后通过学习算法来训练分类器:
那么这些正负例(汽车 or 非汽车)训练样本可以用图形表示如下:
假设每幅图片有50 * 50 = 2500个像素,那么每个样本有2500个像素点可以选择,如果是是二次项组合特征,大约有3百万个特征组合:
对于这样的有着大量特征的分类问题,除了逻辑回归,是否还有其他的学习算法?接下来,我们将引入神经网络(Neural Networks),一种试图模拟人类大脑的学习算法,这个算法,对于复杂的假设空间和复杂的非线性问题有很好的学习能力。
2) Neurons and the brain (神经元和大脑)
神经网络:
大脑很神奇,可以让我们去听,去看,去触,也可以做数学题,做微积分,做很多神奇的事情,要模仿大脑,似乎需要我们写很多程序来做不同的事情?但是恰恰与此相反,做这些事情仅仅需要一个学习算法。下面是两个例子,是神经科学家做的非常酷的两个实验,这些实验可以说明我们仅需一种学习算法就可以模拟很多事情。
听觉皮层实验:
上图是大脑的一部分,红色的部分是听觉皮层,用来处理耳朵收集的声音信号并让大脑理解。神经科学家做了一个实验,切断耳朵和听觉皮层的联系,并且连接眼睛和听觉皮层,这样从眼睛采集的信号不再传送到视神经而是听觉皮层,这样做得最终结果是听觉皮层将会学习“看"。
体感皮层实验:
上图的红色区域是体感皮层,主要身体的触觉,与听觉皮层实验相似,如果我们做相似的实验,那么体感皮层也将学会”看“。
上述两个实验统称为神经重布线实验(neuro-rewiring experiments), 这些实验给我们的感觉就是同样的一块儿脑组织既可以处理视觉,也可以处理听觉,还可以处理触觉,也许就存在一种学习算法来处理视觉信号,听觉信号和触觉信号。如果我们能近似模拟或实现大脑的这种学习算法,我们就能获得绝大部分大脑可以完成的功能,因为大脑可以自己去处理不同类型的数据。以下是一些模拟大脑传感器的例子:
包括:用舌头去“看”;回声定位或者声纳定位;触觉皮带-方向感(向小鸟一样感知方向);给青蛙植入第三只眼。
这些都是很酷的例子,也许人类的AI之梦并不遥远了!
3) Model representation I (模型表示一)
大脑中的神经元:
神经网络的目标就是模拟大脑中的神经元或网络,因此在介绍hypotheses的表示之前,先让我们来看一看大脑中神经元:
注:关于这一块儿,由于不太熟悉,即使听Andrew Ng 老师的课也有很多糊涂的地方,于是Google了一下神经网络,发现了一个非常不错的介绍神经网络的材料《神经网络入门(连载)》,以下转载自该连载中对于大脑中的神经元的描述,我觉得非常清楚:
在人的生命的最初9个月内,这些细胞以每分钟25,000个的惊人速度被创建出来。神经细胞和人身上任何其他类型细胞十分不同,每个神经细胞都长着一根像 电线一样的称为轴突(axon)的东西,它的长度有时伸展到几厘米[译注],用来将信号传递给其他的神经细胞。神经细胞的结构如图1 所示。它由一个细胞体(soma)、一些树突(dendrite) 、和一根可以很长的轴突组成。神经细胞体是一颗星状球形物,里面有一个核(nucleus)。树突由细胞体向各个方向长出,本身可有分支,是用来接收信号 的。轴突也有许多的分支。轴突通过分支的末梢(terminal)和其他神经细胞的树突相接触,形成所谓的突触(Synapse,图中未画出),一个神经 细胞通过轴突和突触把产生的信号送到其他的神经细胞。
每个神经细胞通过它的树突和大约10,000个其他的神经细胞相连。这就使得你的头脑中所有神经细胞之间连接总计可能有l,000,000,000,000,000个。这比100兆个现代电话交换机的连线数目还多。所以毫不奇怪为什么我们有时会产生头疼毛病!
神经细胞利用电-化学过程交换信号。输入信号来自另一些神经细胞。这些神经细胞的轴突末梢(也就是终端)和本神经细胞的树突相遇形成突触 (synapse),信号就从树突上的突触进入本细胞。信号在大脑中实际怎样传输是一个相当复杂的过程,但就我们而言,重要的是把它看成和现代的计算机一 样,利用一系列的0和1来进行操作。就是说,大脑的神经细胞也只有两种状态:兴奋(fire)和不兴奋(即抑制)。发射信号的强度不变,变化的仅仅是频 率。神经细胞利用一种我们还不知道的方法,把所有从树突上突触进来的信号进行相加,如果全部信号的总和超过某个阀值,就会激发神经细胞进入兴奋 (fire)状态,这时就会有一个电信号通过轴突发送出去给其他神经细胞。如果信号总和没有达到阀值,神经细胞就不会兴奋起来。这样的解释有点过分简单 化,但已能满足我们的目的。
注意对于我们的这幅图来说,比较关键的是树突(dendrite)是输入(input wires),轴突(axon)是输出(output wires).
现在我们模拟大脑中的神经元结构建立一个简单的模型-Logistic unit:
其中称为输入(来自与其他神经元的输入信号),
称为偏置单元(bias unit),
称为权重或参数,
称为激活函数(activation function), 这里的激活函数用了sigmoid(logistic) function:
将多个神经元组织在一起,我们就有了神经网络,例如如下的三层结构的神经网络:
第一层称为输入层,第二层是隐藏层,第三层是输出层,注意输入层和隐藏层都存在一个偏置(bias unit). 其中:
= j层第i个单元的激活函数
= 从第j层映射到第j+1层的控制函数的权重矩阵
对于上图,我们有如下的公式表示:
如果神经网络在第j层有个单元,在第j+1层有
个单元,那么权重矩阵
的纬度是
4) Model representation II (模型表示二)
前馈网络:向量化实现
上一节我们讲到的神经网络称为前馈网络,也称前向网络,这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出层,层间没有向后的反馈信号,因此被称为前馈网络。感知机( perceptron)与BP神经网络就属于前馈网络。我们已经给出了这个神经网络的模型表示,但是不够简洁,下面我们来向量化这个模型(具体的过程推荐看视频,以下仅给出总结):
其他的网络结构:
除了上述的前馈网络外,神经网络还有其他的一些网络结构,譬如:
其中第一层仍是输入层,最后一层第四层数输出层,中间两层是隐藏层。
5) Examples and intuitions I (例子和直观解释一)
本节和下一节的例子均是“逻辑代数”中的逻辑函数,因此有必要在这里交代一点逻辑代数的背景,以下文字摘录自清华大学出版社的《电子技术基础》6.2节,电子书链接来自Google book,同时会在例子的介绍中引用该书中的一些基本定义:
逻辑代数是描述客观事物逻辑关系的数学方法,它首先是由英国数学家乔治*布尔提出,因此也称为布尔代数,而后克劳德*香农将逻辑代数应用到继电器开关电路的设计中,所以又称为开关代数。和普通代数一样,在逻辑代数中用字母表示变量与函数,但变量与函数的取值只有0和1两种可能。这里的0和1已不再表示数量的大小,只代表两种不同的逻辑状态。我们把这种二值变量称为逻辑变量,简称为变量,这种二值函数称为逻辑函数,简称为函数。
非线性分类器例子-异或(XOR)/同或(XNOR)
我们的目标是利用神经网络实现一个逻辑代数中的同或运算,因此首先介绍一下同或运算和异或运算:
同或逻辑和异或逻辑是只有两个逻辑变量的逻辑函数。如果当两个逻辑变量A和B相同时,逻辑函数F等于1,否则F等于0,这种逻辑关系称为同或。反之,如果当两个逻辑变量A和B相异时,逻辑函数F等于1,否则F等于0,这种逻辑关系称为异或。
下图是一个同或预算的示例,其中是二值变量(0, 1):
可以将其对应到一个非线性分类器,如下图所示:
同或逻辑和异或逻辑互补:
同或运算和异或运算是逻辑代数中的复合运算,因此下面我们先介绍三种最基本的逻辑运算(与逻辑运算、或逻辑运算、非逻辑运算),同时分别介绍其对应的神经网络实现,最后将这几种基本的逻辑运算组合,形成最终的同或逻辑运算的神经网络。
与(AND)逻辑运算示例:
相信大家对于与(AND)运算很熟悉,其基本的表达式如下:
我们可以用一个简单的神经网络(一个神经元)表示与逻辑运算:
其中激活函数可以用如下公式表示:
这里的激活函数是sigmoid(logistic) function,其图形表示如下:
对于g(z)来说,当z>=4.0时,g(z)约等于1;当z<=-4.0时,g(z)约等于-1. 对于上述激活函数,将二值(0, 1)变量代入,我们得到如下的对应表:
可以看出,这里的神经网络激活函数近似等于与逻辑运算。
或(OR)逻辑运算示例:
同理,我们也给出一个简单的神经网络模型来模拟或(OR)逻辑运算:
将二值(0, 1)变量代入,得到如下的或逻辑运算对应表:
6) Examples and intuitions II (例子和直观解释二)
继续上一节的例子,我们介绍第三个基本的逻辑运算:非(NOT)逻辑运算
用一个简单的神经网络模型来模拟非(NOT)逻辑运算:
得到的对应表如下:
非逻辑运算仅针对一个输入值,我们来表示一个略微复杂的逻辑表达式:
这个表达式等于1的前提是”当且仅当x1=x2=0".
可以用神经网络模拟如下:
好了,有了上述三个基本逻辑运算的基础和相关的神经网络模型表示,我们可以将其组合为一个略微复杂的”同或(XNOR)逻辑运算的神经网络“:
对于这个神经网络,这里稍作一点解释,同或运算的表达式如下:
上图中第二层隐藏网络a1和a2分别代表了A And B和Not A And Not B,a1和a2又做了一次或逻辑运算就得到了同或逻辑运算。该神经网络对应的输出与同或运算的真值表相同:
第6节的手写数字识别(分类)的演示请读者自行观看视频,此处略。
7) Multi-class classification (多类分类问题)
在逻辑回归的笔记中,我们谈到了多类分类问题,而神经网络同样可以应用于多类分类问题,只不过在表达上略有区别。首先来看一个机器视觉中分类的例子:
对于一个输入图片,需要识别其属于行人、轿车、摩托车或者卡车中的一个类型,这是一个多类分类的问题。用神经网络表示如下:
其中输出是一个4维向量,如下表示:
当向量的某个元素为1,其他为0时,代表分类结果为某个为1元素所对应的类别。这与之前逻辑回归中的多类分类表示不同,在逻辑回归中,输出y属于类似于{1, 2, 3,4}中的某个值,而非一个向量。因此,如果要训练一个多类分类问题的神经网络模型,训练集是这样的:
特别注意是一个向量。
本章到此结束,下一讲将会将神经网络的学习问题。转载请注明出处"我爱公开课”,谢谢。
参考资料:
http://en.wikipedia.org/wiki/Neural_network
http://en.wikipedia.org/wiki/Artificial_neural_network
http://library.thinkquest.org/29483/neural_index.shtml
http://home.agh.edu.pl/~vlsi/AI/xor_t/en/main.htm
http://en.wikipedia.org/wiki/NOR_logic
http://en.wikipedia.org/wiki/Logic_gate
清华大学出版社的《电子技术基础》,google book
斯坦福大学机器学习第七课"正则化“学习笔记,本次课程主要包括4部分:
1) The Problem of Overfitting(过拟合问题)
2) Cost Function(成本函数)
3) Regularized Linear Regression(线性回归的正则化)
4) Regularized Logistic Regression(逻辑回归的正则化)
以下是每一部分的详细解读。
1) The Problem of Overfitting(过拟合问题)
拟合问题举例-线性回归之房价问题:
a) 欠拟合(underfit, 也称High-bias)
b) 合适的拟合:
c) 过拟合(overfit,也称High variance)
什么是过拟合(Overfitting):
如果我们有非常多的特征,那么所学的Hypothesis有可能对训练集拟合的非常好(),但是对于新数据预测的很差。
过拟合例子2-逻辑回归:
与上一个例子相似,依次是欠拟合,合适的拟合以及过拟合:
a) 欠拟合
b) 合适的拟合
c) 过拟合
如何解决过拟合问题:
首先,过拟合问题往往源自过多的特征,例如房价问题,如果我们定义了如下的特征:
那么对于训练集,拟合的会非常完美:
所以针对过拟合问题,通常会考虑两种途径来解决:
a) 减少特征的数量:
-人工的选择保留哪些特征;
-模型选择算法(之后的课程会介绍)
b) 正则化
-保留所有的特征,但是降低参数的量/值;
-正则化的好处是当特征很多时,每一个特征都会对预测y贡献一份合适的力量;
2) Cost Function(成本函数)
依然从房价预测问题开始,这次采用的是多项式回归:
a) 合适的拟合:
b) 过拟合
直观来看,如果我们想解决这个例子中的过拟合问题,最好能将的影响消除,也就是让
.
假设我们对进行惩罚,并且令其很小,一个简单的办法就是给原有的Cost function加上两个略大惩罚项,例如:
这样在最小化Cost function的时候,.
正则化:
参数取小一点的值,这样的优点:
-“简化”的hypothesis;
-不容易过拟合;
对于房价问题:
-特征包括:
-参数包括:
我们对除以为的参数进行惩罚,也就是正则化:
正式的定义-经过正则化的Cost Function有如下的形式:
其中称为正则化参数,我们的目标依然是最小化
:
例如,对于正则化的线性回归模型来说,我们选择来最小化如下的正则化成本函数:
如果将 设置为一个极大的值(例如对于我们的问题,设
)? 那么
-算法依然会正常的工作, 将 设置的很大不会影响算法本身;
-算法在去除过拟合问题上会失败;
-算法的结构将是欠拟合(underfitting),即使训练数据非常好也会失败;
-梯度下降算法不一定会收敛;
这样的话,除了,其他的参数都约等于0,
, 将得到类似如下的欠拟合图形:
关于正则化,以下引自李航博士《统计学习方法》1.5节关于正则化的一些描述:
模型选择的典型方法是正则化。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项(regularizer)或罚项(penalty term)。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。比如,正则化项可以是模型参数向量的范数。
正则化符合奥卡姆剃刀(Occam's razor)原理。奥卡姆剃刀原理应用于模型选择时变为以下想法:在所有可能选择的模型中,能够很好地解释已知数据并且十分简单才是最好的模型,也就是应该选择的模型。从贝叶斯估计的角度来看,正则化项对应于模型的先验概率。可以假设复杂的模型有较大的先验概率,简单的模型有较小的先验概率。
3) Regularized Linear Regression(线性回归的正则化)
线性回归包括成本函数,梯度下降算法及正规方程解法等几个部分,不清楚的读者可以回顾第二课及第四课的笔记,这里将分别介绍正则化后的线性回归的成本函数,梯度下降算法及正规方程等。
首先来看一下线性回归正则化后的Cost function:
我们的目标依然是最小化,从而得到相应的参数
. 梯度下降算法是其中的一种优化算法,由于正则化后的线性回归Cost function有了改变,因此梯度下降算法也需要相应的改变:
注意,对于参数,梯度下降算法需要区分
和
。
同样的正规方程的表达式也需要改变,对于:
X 是m * (n+1)矩阵
y是m维向量:
正则化后的线性回归的Normal Equation的公式为:
假设样本数m小于等于特征数x, 如果没有正则化,线性回归Normal eqation如下:
如果不可逆怎么办?之前的办法是删掉一些冗余的特征,但是线性回归正则化后,如果
,之前的公式依然有效:
其中括号中的矩阵可逆。
4) Regularized Logistic Regression(逻辑回归的正则化)
和线性回归相似,逻辑回归的Cost Function也需要加上一个正则化项(惩罚项),梯度下降算法也需要区别对待参数
??Hypothesis?????
?????????Cost Function???
?????????
??" />h_\theta(x) = \frac{1}{1+e^{-\theta^Tx}}$$.
参考资料:
李航博士《统计学习方法》
http://en.wikipedia.org/wiki/Regularization_%28mathematics%29
http://en.wikipedia.org/wiki/Overfitting
如转载52opencourse上的任何原创文章,请务必注明出处,谢谢!欢迎大家在这里讨论和学习!