机器学习是目前最流形的话题,为了不落后时代,开始读书。
Tariq Rashid, Make your own neutral network
我们每天都会做很多的决定,比如早晨穿什么衣服,中午吃什么饭,晚上看什么电影,睡觉的时候是侧身睡还是仰面睡。对于天秤座的人而言,每样决定都会耗费太多的精力和时间。那么,世界上有没有一种机器,只需要输入一些东西后,来替你做出决定呢。得益于这个AI技术的发展,正逐步得以实现。AI通过一些指令集,称为算法,来实现我们想要的这种机器。其中一种算法叫做神经网络。
首先,先抽象化一下我们的问题。
我们想把一些数据输入到一个黑箱内,它经过运算后,输出结果。输入和输出不难理解,中间到底做了什么事情,能够把我们的输入变成了有意义的输出呢?
下面开始类比一下,生物是如何得到输入后,开始输出的。
设想一个场景:一位屌丝码农睡眼惺忪的去挤公交车上班,刚到车站,突然旁边飘过一阵异香,紧接着他顺着香味飘来的方向,发现一个身材高挑的长发女子,对他回眸一笑。他忍不住走向前去,对美女说:“能加个微信吗?”
现在我们来分析这个场景,对码农这个智能人来说什么是输入呢?输入有气味,这属于味觉的,还有属于视觉的:身材,容貌和衣着。这些输入经过码农身体做了一番事情后,产生了输出,这个输出就是前去搭讪。对这个过程的输入输出我们都很了解,但是连接两者的码农身体到底发生了什么事情,使得码农产生了搭讪的动作,这是我们想要知道的。
生物能够对各种刺激和场景做出反应,得益于身体内有强大的神经网络。组成神经网络的单位是神经元。
下图是一个神经元
一个神经元(neuron)包括三个部分树突(dendrite),轴突(axon)和末梢(terminals)。三者有不同的功能,其中树突接受到刺激后会产生电流,轴突负责把电流传导到末梢,末梢连接其他的神经元。最终的末梢连接到各个组织器官,产生相应动作。
比如码农闻到香味,并看到美女后,各种感官的输入,使得树突产生电流,由轴突传导到周围神经元,最终到达腿部肌肉和语言中枢,产生走向前去,并且搭讪的动作。
那么,生物能够完成复杂的任务,体内应该有多少神经元呢?据统计,果蝇体内有十万个神经元,就可以使它能够完成,飞行,捕食,躲避危险等复杂的任务。人类体内的神经元更多,人的脑子大概拥有一亿个神经元。
现在计算机不可能真正复现人脑的功能。所以只能将神经网络进行抽象和简化,用简单的模型去描述这个复杂的网络。这个模型必须有输入,有输出,必须有传递。抽象如下图。
一个神经元被抽象为一个节点,输入电流就是输入一个数字。为了使网络复杂,把网络进行分层。第一层称为输入层,最后一层称为输出层,中间称为隐藏层。
从一个节点传播到另一个节点,不是原封不动的传播,而是有权重分配。比如第一层的节点1可以传播到第二层的节点1,2,3,传入的数量并不是平均分配的。这个很好理解,比如看一个人,有人喜欢好看的皮囊,有人喜欢有趣的灵魂。那么不同的人在皮囊和灵魂上给与的权重是不同的。
另外在接受信号时也不是原封不动的接受,接受前要经过一个函数的考验。我想,并不是每个人都像前述码农一样,见到美女都要搭讪的。就像好声音上的导师,不是对每个上台的人都会转身。这是因为神经元对信号有大小的要求,只有在信号达到一定数值后才会产生冲动,这个大小称为阈值。好声音的导师,面目狰狞,异常纠结,并没有转身的时候,信号接近阈值,一旦突破阈值,才会转身----I WANT YOU!可能上述码农的神经元的阈值比较低,见个美女都想说-I WANT YOU!
接下来,就是数学了,下次再说吧。剧透一下:
从输入到输出过程中的运算,就是熟悉的矩阵运算。
上次写完第一篇,竟然有人催着写第二篇。我也体会到了白云大妈被催着写《月子2》的心情了,那是相当地激动。
闲话少叙,直入正题。上次说到,我们把要输入的东西,放入一个由权重组成的网络,经过简单的矩阵乘法就能得到输出。有人会问了,输入是按我的意图输入的,那输出的东西是我要的吗?比如,给我。
这里要指出的是,神经网络在养成之前,输出的东西真的不是你想要的。记住,神经网络在培养之前,给不了你想要的东西。
举个栗子,说明一下为什么会这样。你想啊,一个未懂事的小孩,你拿个点燃的蜡烛靠近他,他会怎么样?他可能直接拿手去抓这个火焰。原因就在于蜡烛火焰绚丽的输入,经过小孩的神经网络计算后,输出了手抓的冲动,当然这个输出不是我们想要的,这是一个错误的输出。那么,小孩的神经网络就需要去培养,比如,你可以经常拿蜡烛去烫他,慢慢的这个神经网络就会有正确的输出-看到蜡烛就会躲避,甚至见到蜡烛就会哭。(我想,看到这里,就会认同给孩子一定的挫折教育,这样可以形成强大的抗压神经网络)。
好了,孩子是生出来的。我们的神经网络(也就是权重)首先也要生出来,怎么生出初始化的神经网络呢。答案是随机生成。
随机生成后,我们用训练集的数据去训练它。训练集就是一组有明确输入,并且知道正确输出的数据。也就是说,你知道训练集的答案。比如我们去培养一个小孩躲避危险,训练集是这样的{火焰,躲开;坏人,报警;地震,趴下;...},一个小孩得到这样的训练后,他会形成一个会躲避危险的神经网络。
现在把训练集的第一个数据集输入神经网络,经过矩阵计算得到输出,得到输出后,对一下正确答案吧,这个输出也许离正确有十万八千里。没关系,我们看一下误差。知道差距了,才知道怎么去改正。
当当当...梯度来了。这对不熟悉数学的人来说是一个陌生的概念。