总结
本系列是机器学习课程的系列课程,主要介绍机器学习中神经网络算法。
本门课程的目标
完成一个特定行业的算法应用全过程:
懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合
+算法评估+持续调优+工程化接口实现
参考
机器学习定义
关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用:
对于某类任务T和性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习。
机器学习的5大流派:
①符号主义:使用符号、规则和逻辑来表征知识和进行逻辑推理,最喜欢的算法是:规则和决策树
②贝叶斯派:获取发生的可能性来进行概率推理,最喜欢的算法是:朴素贝叶斯或马尔可夫
③联结主义:使用概率矩阵和加权神经元来动态地识别和归纳模式,最喜欢的算法是:神经网络
④进化主义:生成变化,然后为特定目标获取其中最优的,最喜欢的算法是:遗传算法
⑤类推学派Analogizer:根据约束条件来优化函数(尽可能走到更高,但同时不要离开道路),最喜欢的算法是:支持向量机
神经网络
人脑是怎样工作的
1)输入(感受)区就一个运动神经元来讲,胞体或树突膜上的受体是接受传入信息的输入区,该区可以产生突触后电位(局部电位)。
2)整合(触发冲动)区始段属于整合区或触发冲动区,众多的突触后电位在此发生总和,并且当达到阈电位时在此首先产生动作电位。
3)冲动传导区轴突属于传导冲动区,动作电位以不衰减的方式传向所支配的靶器官。
4)输出(分泌)区轴突末梢的突触小体则是信息输出区,神经递质在此通过胞吐方式加以释放。
人类大脑中神经元的总数可能在750亿到1250亿之间,一般人脑有神经元120到140亿个,而且大脑神经元是不可再生的,一般情况下,在成人以后会随着年龄的增加而逐渐减少。
大脑神经元一般估计数值是860亿,粗略1000亿也OK,140亿是大脑皮层的神经元数量,。
神经元的基本功能是通过接受、整合、传导和输出信息进行信息的传递与处理,通俗来说,神经元具有支配运动,感受信息的作用,人体通过神经元构成一个完整的个体,构成完整的神经功能。大脑的四周包着一层含有静脉和动脉的薄膜,这层薄膜里充满了感觉神经,但是大脑本身却没有感觉,人的大脑平均为人体总体重的2%,但它需要使用全身所用氧气的25%,相比之下肾脏只需12%,心脏只需7%,神经信号在神经或肌肉纤维中的传递速度可以高达每小时200英里。
随着人的年龄增大,血管(特别是毛细血管)越来越堵塞,大脑得到的血液越来越少,要保持血管畅通,就要少吃油、少吃肉、少吃糖,多吃蔬菜、水果,保持良好心态,适当运动,充足睡眠,经常适度用脑,这样便可以使脑细胞中的神经元更慢的流走。
模拟人脑神经元进行思考的神经网络
看到一幅画
输出 齐白石的虾
输出 栩栩如生、妙手丹青、神来之笔
听到一句话 Thank you all for your applause
输出 谢谢大家的掌声
看到一个数据集
输出数据集之间的关系
行星轨道方程简单推导
感知机 perceptron
看到一个数据集
输出数据集之间的关系
线性关系:累加和倍乘
现在想象一下,我们不知道千米和英里之间的转换公式。我们所知道 的就是,两者之间的关系是线性的。这意味着,如果英里数加倍,那么表 示相同距离的千米数也是加倍的。这是非常直观的。如果这都不是真理, 那么这个宇宙就太让人匪夷所思了。 千米和英里之间的这种线性关系,为我们提供了这种神秘计算的线 索,即它的形式应该是“英里=千米×C”,其中C为常数。现在,我们还不知 道这个常数C是多少。 我们拥有的唯一其他的线索是,一些正确的千米/英里匹配的数值对示 例。这些示例就像用来验证科学理论的现实世界观察实验一样,显示了世 界的真实情况。
这里,我们令:英里=千米×C,其中千米为100,当前,我们猜测C为 0.5。 这台机器得到50英里的答案。 嗯,鉴于我们随机选择了C = 0.5,这种表现还算不错。但是,编号为2 的真实示例告诉我们,答案应该是62.137,因此我们知道这是不准确的。 我们少了12.137。这是计算结果与我们列出的示例真实值之间的差 值,是误差。即:
下一步,我们将做些什么呢?我们知道错了,并且知道差了多少。我 们无需对这种误差感到失望,我们可以使用这个误差,指导我们得到第二 个、更好的C的猜测值。再看看这个误差值。我们少了12.137。由于千米转换为英里的公式是 线性的,即英里= 千米×C,因此我们知道,增加C就可以增加输出。 让我们将C从0.5稍微增加到0.6,观察会发生什么情况。 现在,由于将C设置为0.6,我们得到了英里=千米×C = 100×0.6 = 60, 这个答案比先前50的答案更好。我们取得了明显的进步。
糟糕!过犹不及,结果超过了已知的正确答案。先前的误差值为 2.137,现在的误差值为-7.863。这个负号告诉我们,我们不是不足,而是 超调了。请记住上面的公式,误差值等于真实值减去计算值。 如此说来,C = 0.6比C = 0.7好得多。我们可以就此结束这个练习,欣 然接受C = 0.6带来的小小误差。但是,让我继续向前走一小段距离。我们 为什么不使用一个较小的量,微调C,将C从0.6调到0.61呢?
这比先前得到的答案要好得多。我们得到输出值61,比起正确答案 62.137,这只差了1.137。
因此,最后的这次尝试告诉我们,应该适度调整C值。如果输出值越 来越接近正确答案,即误差值越来越小,那么我们就不要做那么大的调 整。使用这种方式,我们就可以避免像先前那样得到超调的结果。同样,读者无需为如何使用确切的方式算出C值而分心,请继续关注 这种持续细化误差值的想法,我们建议将修正值取为误差值的百分比。直 觉上,这是正确的:大误差意味着需要大的修正值,小误差意味着我们只 需要小小地微调C的值。 无论你是否相信,我们刚刚所做的,就是走马观花地浏览了一遍神经 网络中学习的核心过程。我们训练机器,使其输出值越来越接近正确的答 案。 这值得读者停下来,思考一下这种方法,我们并未像在学校里求解数 学和科学问题时所做的一样一步到位,精确求解问题。相反,我们尝试得 到一个答案,并多次改进答案,这是一种非常不同的方法。一些人将这种 方法称为迭代,意思是持续地、一点一点地改进答案。
分类器和预测器
因为上述的简单机器接受了一个输入,并做出应有的预测,输出结 果,所以我们将其称为预测器。我们根据结果与已知真实示例进行比较所 得到的误差,调整内部参数,使预测更加精确。
在上图中,你可以清楚地看到两群小虫。毛虫细而长,瓢虫宽而短。 你还记得给定千米数,预测器试图找出正确的英里数这个示例吗?
这台预测器的核心有一个可调节的线性函数。当你绘制输入输出的关系图 时,线性函数输出的是直线。可调参数C改变了直线的斜率。
如果我们在这幅图上画上一条直线,会发生什么情况呢? 虽然我们不能使用先前将千米数转换成英里数时的同样方式,但是我 们也许可以使用直线将不同性质的事物分开。
在上图中,如果直线可以将毛虫与瓢虫划分开来,那么这条直线就可 以根据测量值对未知小虫进行分类。由于有一半的毛虫与瓢虫在分界线的 同一侧,因此上述的直线并没有做到这一点。 让我们再次调整斜率,尝试不同的直线,看看会发生什么情况。 这一次,这条直线真是一无是处!它根本没有将两种小虫区分开来。 让我们再试一次:
这条直线好多了!这条直线整齐地将瓢虫与毛虫区分开来了。现在, 我们可以用这条直线作为小虫的分类器。我们假设没有未经发现的其他类型的小虫,现在来说,这样假设是没 有问题的,因为我们只是希望说明构建一台简单的分类器的思路。 设想一下,下一次,计算机使用机器手臂抓起一只新的小虫,测量其 宽度和长度,然后它可以使用上面的分界线,将小虫正确归类为毛虫或瓢 虫。
我们已经看到了,在简单的预测器中,如何使用线性函数对先前未知 的数据进行分类。 但是,我们忽略了一个至关重要的因素。我们如何得到正确的斜率 呢?我们如何改进不能很好划分这两种小虫的分界线呢? 这个问题的答案处于神经网络学习的核心地带。让我们继续。
训练分类器
1.让我们尝试从A = 0.25开始,分界线为y = 0.25x 。我们可以观察到直线y = 0.25x 不是一台很好的分类 器。这条直线未将两种类型的小虫区分开来。
由于瓢虫也处在直线之上, 因此我们不能说“如果小虫在直线之上,则这是一条毛虫”。
直观上,我们观察到需要将直线向上移动一点,但是我们要抵制诱 惑,不能通过观察图就画出一条合适的直线。
我们希望能够找到一种可重 复的方法,也就是用一系列的计算机指令来达到这个目标。计算机科学家 称这一系列指令为算法(algorithm)。
让我们观察第一个训练样本数据:宽度为3.0和长度为1.0瓢虫。如果我 们使用这个实例测试函数y =Ax ,其中x 为3.0,我们得到:
y =0.25*3.0= 0.75
在这个函数中,我们将参数A设置为初始随机选择的值0.25,表明对于 宽度为3.0的小虫,其长度应为0.75。但是,由于训练数据告诉我们这个长 度必须为1.0,因此我们知道这个数字太小了。
1.现在,我们需要对这个E做些什么,才能更好地指导我们调整参数A 呢?这是一个重要的问题。 在这个任务中,让我们退一步再想一想。我们希望用y 中称为E的误差值,来搞清楚参数A所需改变的值。要做到这一点,我们需要知道两者的 关系。A与E是如何关联的呢?如果我们知道了这一点,那么我们就可以理 解更改一个值如何影响另一个值。 我们先从分类器的线性函数开始:
y =Ax
我们知道,A的初始猜测值给出了错误的y 值,y 值应该等于训练数据 给定的值。我们将正确的期望值t 称为目标值。为了得到t 值,我们需要稍 微调整A的值。
数学家使用增量符号Δ表示“微小的变化量”。
下面我们将这 个变化量写出来:
t = (A + ΔA)x
让我们在图中将其画出来,以使其更容易理解。在图中,你可以看到 新的斜率
(A+ΔA)。
2.请记住,误差值E是期望的正确值与基于A的猜测值计算出来的值之间 的差值。
也就是说,E等于t -y 。
我们将这个过程写出来,这样就清楚了:
t -y = (A + ΔA)x - Ax
展开表达式并化简:
E =t -y = (A + ΔA)x - Ax
E = (ΔA)x
这是多么美妙啊!误差值E与ΔA存在着一种简单的关系。这种关系如 此简单,以至于我认为这是错的,但实际上这是正确的。无论如何,这种 简单的关系让我们的工作变得相对容易。
根据误差值E,我们希望知道需要将A调整多少,才能改进直线的斜 率,得到一台更好的分类器。要做到这一点,我们只要重新调整上一个方 程,
将 ΔA算出: ΔA= E / x
误差计算
x为3.0 设初始斜率参数A=0.25,则预测的y为0.25*3=0.75,
期望的t为1.1,因为要比1.0大一些,按照误差公式
E =t -y = (A + ΔA)x - Ax
E = (ΔA)x
E = 1.1-0.75 = (ΔA)x = 0.35
误差值为0.35,x 为3.0。可修正的斜率参数为
ΔA = E / x = 0.35 / 3.0 = 0.1167。
这意 味着当前的A = 0.25需要加上0.1167。
这也意味着,修正后的A值为(A +ΔA),即0.25 + 0.1167 = 0.3667。当A=0.3667时,使用这个A值计算得到 的y 值为1.1,正如你所期望的,这就是我们想要的目标值。 唷!我们做到了!我们找到了基于当前的误差值调整参数的方法。
目前我们已经完成了一个实例训练,让我们从下一个实例中学习。
我们已经完成了一个实例训练,让我们从下一个实例中学习。
此时,我们已知正确值对为x = 1.0和y = 3.0。
当线性函数使用更新后的A = 0.3667,并把x = 1.0代入到线性函数中 时,让我们观察会发生什么情况。我们得到
y = 0.3667 * 1.0 = 0.3667。
这与 训练样本中y = 3.0相去甚远。
基于与先前同样的推理,我们希望直线不要经过训练数据,而是稍微高于或低于训练数据,我们将所需的目标值设置为2.9。这样,毛虫的训练样本就在直线上方,而不是在直线之上。
误差值E为2.9-0.3667= 2.5333。
比起先前,这个误差值更大,但是如果仔细想想,迄今为止,我们只使用一个单一的训练样本对线性函数进行训练,很明显,这使得直线偏向于这个单一的样本。
与我们先前所做的一样,让我们再次改进A。
ΔA为E / x ,即2.5333 /1.0 = 2.5333。
这意味着较新的A为0.3667 + 2.5333 = 2.9。这也意味着,对于x = 1.0,函数得出了2.9的答案,这正是所期望的值。
这个训练量有点大了,因此,让我们再次暂停,观察我们已经完成的内容。下图显示出了初始直线、向第一个训练样本学习后的改进直线和向第二个训练样本学习后的最终直线。
这是什么情况啊!看着这幅图,我们似乎并没有做到让直线以 我们所希望的方式倾斜。这条直线没有整齐地划分出瓢虫和毛虫。 好了,我们理解了先前的诉求。改进直线,以得出各个所需的y 值。 这种想法有什么错误呢?如果我们继续这样操作,使用各个训练数据 样本进行改进,那么我们所得到的是,最终改进的直线与最后一次训练样 本非常匹配。实际上,最终改进的直线不会顾及所有先前的训练样本,而 是抛弃了所有先前训练样本的学习结果,只是对最近的一个实例进行了学习。 如何解决这个问题呢?
调节系数通常被称为学习率(learning rate),在此,我们称之为L。 我们就挑L = 0.5作为一个合理的系数开始学习过程。简单说来,这就意味 着我们只更新原更新值的一半。
再一次重复上述过程,我们有一个初始值A = 0.25。
使用第一个训练样 本,我们得到
y = 0.25 * 3.0 = 0.75,
期望值为1.1,得到了误差值0.35。
ΔA = L(E / x )= 0.5 * 0.35 / 3.0 = 0.0583。
更新后的A值为0.25 + 0.0583 = 0.3083。
尝试使用新的A值计算训练样本,
在x = 3.0时,得到y = 0.3083 * 3.0 = 0.9250。
现在,由于这个值小于1.1,因此这条直线落在了训练样本错误的 一边,但是,如果你将这视为后续的众多调整步骤的第一步,则这个结果 不算太差。与初始直线相比,这条直线确实向正确方向移动了。
我们继续使用第二个训练数据实例,x = 1.0。使用A = 0.3083,我们得 到
y = 0.3083 * 1.0 = 0.3083。
所需值为2.9,因此误差值是2.9-0.3083= 2.5917。
ΔA = L(E / x ) = 0.5 * 2.5917 / 1.0 = 1.2958。
当前,第二个更新的值 A等于0.3083 + 1.2958 = 1.6042。
让我们再次观察初始直线、改进后的直线和最终直线,观察这种有节 制的改进是否在瓢虫和毛虫区域之间是否得到了更好的分界线。
神经元
虽然神经元有各种形式,但是所有的神经元都是将电信号从一端传输 到另一端,沿着轴突,将电信号从树突传到树突。然后,这些信号从一个 神经元传递到另一个神经元。这就是身体感知光、声、触压、热等信号的 机制。来自专门的感觉神经元的信号沿着神经系统,传输到大脑,而大脑 本身主要也是由神经元构成的。
我们需要多少个神经元才能执行相对复杂的有趣任务呢? 一般说来,能力非常强的人类大脑有大约1000亿个神经元!一只果蝇 拥有约10万个神经元,能够飞翔、觅食、躲避危险、寻找食物以及执行许 多相当复杂的任务。10万个神经元,这个数字恰好落在了现代计算机试图复制的范围内。一只线虫仅仅具有302个神经元,与今天的数字计算机资源 相比,简直就是微乎其微!但是一只线虫能够完成一些相当有用的任务, 而这任务对于尺寸大得多的传统计算机程序而言却难以完成。
1.神经元表示为线性函数吗?虽然这是个好主意,但是不可以这样做。生物神经元与简单的线性函数不一样,不能简单地对输入做出的响应,生成输出。也就是说,它的输出不能采用这种形式:输出=(常数*输入)+(也许另一常数)。
观察表明,神经元不会立即反应,而是会抑制输入,直到输入增强,强大到可以触发输出。你可以这样认为,在产生输出之前,输入必须到达一个阈值。就像水在杯中——直到水装满了杯子,才可能溢出。直观上,这是有道理的——神经元不希望传递微小的噪声信号,而只是传递有意识的明显信号。下图说明了这种思想,只有输入超过了阈值(threshold),足够接通电路,才会产生输出信号。
字母e是数学常数 2.71828
e是自然对数的底数
自然对数是以e为底的对数函数,e是一个无理数,约等于2.718281828
由于任何数的0次方都等于1,因此当x 为0时,e -x 为1。因 此y 变成了1/(1 + 1),为1/2。此时,基本S形函数在y = ½时,对y 轴进行 切分。 我们使用这种S函数,而不使用其他可以用于神经元输出的S形函数, 还有另一个非常重要的原因,那就是,这个S函数比起其他S形函数计算起 来容易得多,在后面的实践中,我们会看到为什么。 让我们回到神经元,并思考我们如何建模人工神经。
如果组合信号不够强大,那么S阈值函数的效果是抑制输出信号。如 果总和x 足够大,S函数的效果就是激发神经元。有趣的是,如果只有其中 一个输入足够大,其他输入都很小,那么这也足够激发神经元。更重要的 是,如果其中一些输入,单个而言一般大,但不是非常大,这样由于信号 的组合足够大,超过阈值,那么神经元也能激发。这给读者带来了一种直 观的感觉,即这些神经元也可以进行一些相对复杂、在某种意义上有点模 糊的计算。
树突收集了这些电信号,将其组合形成更强的电信号。如果信号足够 强,超过阈值,神经元就会发射信号,沿着轴突,到达终端,将信号传递 给下一个神经元的树突。下图显示了使用这种方式连接的若干神经元。
需要注意的一点是,每个神经元接受来自其之前多个神经元的输入, 并且如果神经元被激发了,它也同时提供信号给更多的神经元。 将这种自然形式复制到人造模型的一种方法是,构建多层神经元,每 一层中的神经元都与在其前后层的神经元互相连接。
你可以看到三层神经元,每一层有三个人工神经元或节点。你还可以 看到每个节点都与前一层或后续层的其他每一个节点互相连接。 这真是太棒了!
但是,这看起来很酷的体系架构,哪一部分能够执行 学习功能呢?针对训练样本,我们应该如何调整做出反应呢?有没有和先 前线性分类器中的斜率类似的参数供我们调整呢? 最明显的一点就是调整节点之间的连接强度。
在一个节点内,我们可 以调整输入的总和或S阈值函数的形状,但是比起简单地调整节点之间的 连接强度,调整S阀值函数的形状要相对复杂。
本图再一次显示了连接的节点,但是这次在每个连接上显示了相关的权重。较小的权重 将弱化信号,而较大的权重将放大信号。
此处,我需要解释一下权重符号旁边的有趣小数字(即下标)。简单 说来,权重w 2,3 与前一层节点2传递给下一层的节点3的信号相关联。
因此,权重w 1,2 减小或放大节点1传递给下一层节点2的信号。为了详细说明 这种思路,下图突出显示了第一层和第二层之间的两条连接。
你可能有充分的理由来挑战这种设计,质问为什么必须把前后层的每 一个神经元与所有其他层的神经元互相连接,并且你甚至可以提出各种创 造性的方式将这些神经元连接起来。我们不采用创造性的方式将神经元连 接起来,原因有两点,第一是这种一致的完全连接形式事实上可以相对容 易地编码成计算机指令,第二是神经网络的学习过程将会弱化这些实际上 不需要的连接(也就是这些连接的权重将趋近于0),因此对于解决特定任 务所需最小数量的连接冗余几个连接,也无伤大雅。
我们的意思是什么呢?这意味着,随着神经网络学习过程 的进行,神经网络通过调整优化网络内部的链接权重改进输出,一些权重 可能会变为零或接近于零。零或几乎为零的权重意味着这些链接对网络的 贡献为零,因为没有传递信号。零权重意味着信号乘以零,结果得到零, 因此这个链接实际上是被断开了。
在神经网络中追踪信号
确定方向过程
针对完全没有基础的同学们
1.确定机器学习的应用领域有哪些
2.查找机器学习的算法应用有哪些
3.确定想要研究的领域极其对应的算法
4.通过招聘网站和论文等确定具体的技术
5.了解业务流程,查找数据
6.复现经典算法
7.持续优化,并尝试与对应企业人员沟通心得
8.企业给出反馈