【课堂笔记】人工神经网络前言

1. 前言
a. 斋藤康毅,深度学习入门——教材(鱼书)
i. 没有用任何的框架,从最原始素材开始介绍
ii. 透过框架(该封装的封装好)看本质:对于学习技术而言,逻辑关系更清晰
b. 参考书(了解更多技术):
i. 更深入地学习:神经网络与深度学习(邱锡鹏)
ii. 圣经:Deep Learning (花书,Ian Goodfellow,GAN网络的提出者;Yoshua Bengio,博士生导师,2018图灵奖获得者)
1) 有些内容可能已经有点老了
c. 如果完全采用别人的代码,跑出来一个结果,需要在开头第一行二号字体,黄色背景,红色字地注明
d. 宋麟老师:深度学习与实践
2. 第一讲:感知机与前馈神经网络
a. 神经网络的发展阶段
i. 第一阶段:启蒙期
1) 1943年,心理学家Warren McCulloch和数学家Walter Pitts最早描述了一种理想化的人工神经网络,并构建了一种基于简单逻辑运算的计算机制。他们提出的神经网络称为MP模型
a) 二战:解剖生理学伤亡比较多,有条件去研究生物大脑的机制
2) 1958年,Rosenblatt提出了感知机(Perceptron),是一种可以模拟人类感知能力的神经网络模型,提出了一种接近于人类学习过程(迭代、试错)的学习算法
ii. 第二阶段:冰河期(关键瓶颈)
1) 1969年,Marvin Minsky出版《感知机》一书,指出两个重要问题:
a) 感知机无法处理异或回路(XOR)
i) 相同的输出为0,不同的输出为1
b) 电脑没有足够的能力来处理大型神经网络需要很长的时间
iii. 第三阶段:复兴期(方向传播算法)
1) 1983年,Caltech的物理学家John Hopfield对神经网络引入能量函数的概念,并提出了用于联想记忆和优化计算的网络,在旅行商问题上获得当时最好的结果
2) 1984年,Geoffey Hinton提出一种随机化版本的Hopfield网络,即玻尔兹曼机
a) BP算法不是Hinton提出的(虽然文章包含他的名字)
3) 1986年,重新发明了反向传播算法
4) 1989年,LeCun et al将方向传播算法引入了卷积神经网络,并在手写体数字识别上取得了很大的成果
a) 现在很多案例是手写数字识别,就是因为这个历史
iv. 第四阶段:神经网络研究的低潮期(流行度降低)
1) 20年代90年代中期,统计学习理论和以支持向量机为代表的机器学习模型开始兴起
a) SVM有非常好的数学解释(两类的支持向量之间的距离尽可能大);结果也好;理论也优美
2) 相较之下,神经网络的理论基础不清晰、优化困难、可解释性差;研究神经网络拿不到founding
v. 第五阶段:爆发期(深度学习的崛起)
1) 2006年,出走加拿大多伦多大学的Hinton and Salakhutdinov先通过逐层预训练,再用BP算法进行精调对多层前馈神经网络进行学习
a) 很早人们就注意到了这个现象(网络越深性能越好),所以在概念上其实没有太多的意义
b) 但是可以发Science的意义在于,真的训练出了一个加深的神经网络(可以实现了)
c) 类似于:一层一层盖房子。先训两层浅层神经网络,然后固定住这两层,训新加的一层 → 从训练上来讲还是在训浅层神经网络,但结果上得到了一个深层神经网络
d) 可惜的是,做计算机的人不看Science,也很少看期刊,更多只看自己领域的会议;因此并没有在计算机领域引起轰动,只是在神经网络小圈子里面引起了一定的效应
2) 爆发点:2012年ImageNet,图像分类挑战大赛(创始人,斯坦福大学李菲菲,收集了10^6的图片,需要分1000个类,需要做细粒度分量)
a) ImageNet,评价指标是错误率;允许有5个类别(五次机会)的预测,有一个对就算对;
i) 2012年以前冠军队伍错误率居高不下(缓慢的进步);2012年冠军队伍的错误率一下子降了10个点(颠覆性进步)——国际上纷纷猜测究竟是什么方法能做到这样打的提升,也在猜是哪个队伍——揭晓之后,发现是Jeffery Hinton使用的8层神经网络(深度神经网络)的技术
b) 深度人工神经网络在语音识别和图像分类等任务上取得了巨大成功;此外,随着大规模并行计算以及GPU设备的普及,计算机的计算能力得到大幅提高。此外,可供机器学习的数据规模也越来越大
i) 做视觉的人很多,ImageNet受商业界关注也很多,此后人工神经网络就“出圈”了,而不仅仅限于在研究人工神经网络技术的小圈子内加以研究
One. 出圈过程:CS-人工智能-计算机视觉;CS-人工智能;CS;CS相关领域(软件工程,核查代码,自动生成代码等等);CS外的领域
ii) 17年,机器能做到的错误率可以达到3.5%,已经属于是人能够做到的水平。此后ImageNet的比赛就停下来了,因为机器在这个问题上已经做得比人好了
b. 知名的学术机构及科学家
i. Toronto大学:Hinton 75年Edinburgh大学博士
ii. NYU大学:Lecun 87年Hinton博士
iii. Montreal大学:Begio 91年M. Jordan博士后
iv. Stanford大学:Ng 03nian UC Berkeley大学 M. Jordan博士
v. IDSIA: Jugen Schimidhuber,写了一篇文章,内容是几乎每一个神经网络和深度学习的重大突破同它十几年前的文章的联系;多次在演讲中提到认为图灵奖没有颁给自己不公平
c. 常用的深度学习框架:很多头部的IT公司都提出了自己的框架,进行了推广(model zoo,model.train)… 极大地降低了技术的使用门槛,金钱的力量,“调包工程师”
i. 深度学习是一个工程应用,从应用的角度来说,它没有什么数学(相对地);它最主要的数学背景,就是梯度下降(大一水平)
d. 神经元模型——神经网络的基础
i. 生物神经元:树突——接收外界刺激;细胞体——兴奋/抑制;轴突/突触——将兴奋态传递给其他细胞
1) 单个神经细胞只有两种状态:兴奋和抑制;兴奋——刺激超过阈值触发
ii. 从生物神经元到人工神经元
1) 人工神经元的六点假设
a) 每个神经元都是多入单出的系统:类比生物神经元,就是有多个树突,但是只有一个轴突
b) 神经元输入分兴奋性输入和抑制性输入两种类型
c) 神经元具有空间整合特性和阈值激活特性
i) 空间整合:多个输入加权求和(带权重,不是trivial的求和);x^Tw=x_iw_i
ii) 阈值激活:求和汇聚起来之后,跟阈值比较(阈值激励,阈值是一种阶跃函数),超过阈值就激活;sigma(x^Tw-theta),其中sigma是阶跃函数,theta是阈值
One. 激活函数y=sigma(net),net叫净输入(类似于经管中的,净收益的概念)
d) 神经元输入与输出之间有固定时滞,取决于突触延搁
e) 忽略时间整合和不应期
f) (人工)神经元本身是非时变的,即其突触时延和突触强度均为常数
2) 人工神经元模型也叫“感知机”(感知机是不严格的说法;严格地说只能叫人工神经元模型)
a) 严格的感知机模型,是把人工神经网络中很多的“神经体”部分拼成一列集合成的整体;也就是说,感知机的输出可以有多个输出端
i) 感知机模型,单层神经网络,用于多分类问题
One. 神经元网络的层数,不包括输入,但是可以包括输出。输入是第0层。
b) 人工神经元模型,算是一种二分类的感知机模型;所以它也可以叫二分类的感知机
e. 感知机的数学模型
i. 理论很清晰
ii. 实验效果也很好:
1) 可以模拟简单逻辑电路:与门(逻辑与运算)
a) 与运算:同真才为真
b) 人工神经元模型:在选择一些合适的w1,w2和theta的情况下,的确可以实现,输入两个真/假(1/0),人工神经元可以可以输出与运算的结果
2) 类似的,也可以模拟与非运算(与运算取反)
3) 类似的,也可以做或运算(一真即为真)
4) 50年代的人认为:这么简单一个模型,就可以输出逻辑关系
iii. 可惜的地方:异或门不能实现
1) 亦即,不存在任何一组参数(w1,w2,theta),能够让人工神经元输出与“亦或运算”相同的结果
iv. 为什么搞不定异或门?
1) 画图——水平轴是x1,垂直轴为x2
a) 菱形点和圆心点的分类(菱形点,逻辑运算结果为真(1)的点;圆形点,逻辑运算结果为假(0)的点)
b) 与门,与非门,或门:都是线性可分的——人工神经元(或者感知机模型)相当于线性的分类器,因此可以对这些问题进行分类
i) 线性可分:拿一条线(超平面),把空间一分为二,每一半空间内都是同一类的点;
c) 异或门是线性不可分,非线性可分的:
i) 逻辑亦或,是线性不可分的问题,不能拿线性分类器分开;必须拿非线性分类器才能分开(例如SVM这种带耦合的东西)
ii) 这表明,人工神经元这个模型本身在实现智能的路上,还是存在一定“不足”的
v. 感知机搞不定:多层感知机
1) Minsky出书说感知机没办法搞定异或门;
2) 电子工程师,在工程上的经验:基本逻辑门电路(AND NAND OR)的组合门电路,与门+或门+与非门组合,可以实现两个输入,一个输出,但是组合电路能实现异或门的效果;这个事情在搭数字电路的时候天天干;
3) 类似于,人工神经网络考虑的是相对比较泛化问题;而电子工程师在泛化问题中的一个特殊情况(取值范围只有0,1)中的积累的经验,指出一种特殊的解决方法;而再加上泛化的考虑方式,可以将这种解决方法扩展到更泛化的情况中去
a) 不同领域之间的交流,有时候会非常重要(本领域的知识积累,e^ix|x=x0,x0表示某种发现的解决方法;和其他领域交流,对于其他领域来说,可能就有y=ix0,e^iy|y=y0。因此,对于同一个问题的看法的交流,从不同的角度来说,其意义可能是会有更大的扩展的)
3. Colab
a. 基于Jupyter Notebook的云计算服务
b. 前置条件:能够访问Google,并且创建账户
i. 需要结合Google Drive使用比较好
c. 基本操作
i. 创建单元格(类似于Jupyter Notebook,有代码单元格和文本单元格);单元格上面的按钮可以对单元格进行操作;
1) 代码单元格可以放Python代码和Linux代码(Shell代码需要以!开头);每运行一次代码,都需要连接到会话(session)
2) 运行按钮在左上角
ii. 申请GPU,点右上角资源状态图(RAM,磁盘),进行资源管理 -> 更改运行时类型
iii. 文件操作
1) 临时上传/下载文件:文件面板上传,shell命令下载
2) 挂在Google Drive云盘:插入代码段,在弹出窗口中允许访问Google账号,这样就可以反复挂在
iv. 使用限制:超过一段时间没有操作,Colab自动段考当前会话;GPU超过12个小时自动停用(不管有没有跑)