机器学习是装逼神器?
曾几何时,当我还在本科打dota 玩屁股的时候,身边总有一帮大神。听他们谈话我的心情是。。。
大佬中有各路高手前端、后段、java三大架构。。。但最令本渣一听到就仰慕甚至肃然起敬的是当听到卷积神经网络的时候。顿时就有种掉线三十分钟别人都是六神装的感觉。另外,班会上别班小哥用说用机器学习把图片转换成梵高风格时自己班妹纸那一声声尖叫怕是很难忘掉了。。。
好在家里爸妈给了次重新做人的机会,来到美帝在选了可能是学校最恐怖的一门课python机器学习后,我发现装逼原来也没那么难嘛。。。不过毕竟付出了巨大的发量,所以想着要趁着暑假赶紧记下来,以后跟崽吹个逼啥的。。。哈哈哈
机器学习是数据挖掘
机器学习就是用一大堆数据来训练模型以作出判断或预测。机器学习中有很多的模型(Logistic Regression, SVM, CNN...看不懂?没关系,点个关注后面会一个个讲的),但不论你用那个模型都离不开数据啊,抛开数据谈那就是裸奔。另外我会告诉你,机器学习最快乐的时刻就是搭建完模型看着机器训练数据抛出一行行输出的时候吗?简直比玩口袋妖怪这种养成类游戏还要爽!
机器学习是求极值
好了,敲黑板。。。到了今天的干货时间了。在说明为什么机器学习是求极值前我们先来回顾下高中求极值的题目我们都是怎么做的。
首先,我们有一个函数长得下面这样
我们先对他求导得到他的导函数, 然后令 得到三个点,由左右导数的正负情况判断出是极小值。再带回到算出比要小,所以函数在处有最小值。
说了这么多,那和机器学习有啥关系咧。。。
是不是一上这张图,顿时就嗅到神经网络高大上的气息。然鹅上面这张图最坑的地方在于除了感觉高大上对新手也太不友好了,把这些饼饼和线连起来是要干嘛呀。所以我们还是看自己画的把。。。
首先每个圆粑粑神经元里是有值的,叫做activation(激活值),每条线上也是有值的叫做weight(权重),而每一列神经元叫做一个layer(层)。
那么问题来了,第二层神经元里的值怎么来的呢?没错!就是第一层里三个神经元分别乘上与自己相连的权重——。
下面我们想象一下这个场景,假设第一层里三个值分别代表一个人腰的宽度,胸的宽度和脸的宽度。我们想要根据这三个值来判断一个人是不是小肥肥。由常识可知,脸大不一定胖,胸大不一定胖但一般腰要是很宽的话。。。额那就很有可能和我一样要快乐起来了。。。哈哈哈。所以我们希望与脸宽相连的权重小一些,与胸宽相连的权重也稍微小一些,与腰宽相连的权重大一些,这样我们就可以通过第二层神经元的值的预测是否肥胖——1:小肥肥,0:不肥肥
那么具体这些权重是怎么设置的呢,当然不是手动去设的啦。虽然远古时期的前辈真的造过那种用扳手手动调节的机器这应该叫人工学习吧。。。 要回答这个问题就要引出我们的下一个概念——Loss function(损失函数)
损失函数是用来量化预测值与实际值差别的函数。最经典的是MSE(Mean Square Error)
学机器学很重要一点就是别被公式劝退了,MSE很简单其实就是预测值与实际值的差值(也叫残差)的平方。平方过后就不用担心正负误差相互抵消了。
我们希望预测值与实际值越接近越好,也就是希望损失函数越小越好。那怎么减小损失函数的值呢,答案就是前面说的修改权重也就是线上的值。哪些想要修改神经元里值的同学注意了,第一层神经元里值是样本的数据,也就是每一个人具体的脸宽、胸宽、腰宽,是改不得的(别绝望,有毅力的同学还是可以减肥的。。。)
那怎么修改权重的值来使得损失函数的值最小呢?还记得前面求极值的例子吗,我们也是先求损失函数对权重的导数。但接下来我们不是直接令导函数为零了,因为这个零点求不出啊(后面我们会细讲零点为啥不好求)。那我们怎么办呢,我们朝导数的相反方向一小步一小步挪啊!!! 所以作为一名严谨的up,正如我们前面所说机器学习是求损失函数的极小值,而不保证可以求到最小值 ,当然我们有很多办法来尽可能向最小值逼近。
最后想起了高中数学的老师一句话——人生的目标就像求最小值,没有那么简单。但坚持下,说不定下个极值就是!