搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 「行知」从线性模型到神经网络

「行知」从线性模型到神经网络

2019-04-04
举报

内容来源:计算主义@知乎专栏

出品社区:DataFun

注:欢迎后台留言投稿「行知」专栏文章。

最近笔者受邀进行了一次分享并为此制作了一个 PPT 。完后 PPT 弃之可惜,做成图片配上说明分享于此(PDF版 点击文末阅读原文即可下载)。

「行知」从线性模型到神经网络

题图来自波兰艺术家Zbigniew Bielak。

https://zbigniewbielak.bigcartel.com/

他的作品被许多重金属 / 极端金属乐队用作专辑封面。例如 Mayhem ,Behemoth,Ghost 等。

「行知」从线性模型到神经网络

本 PPT 的内容导览。思路是先介绍线性模型,再从模型集成的视角引入(全连接前馈)神经网络 ANN 。之后介绍 ANN 的训练、实现和应用。

「行知」从线性模型到神经网络

最小二乘线性回归的示意图、计算式和训练。从最后一个 = 号可看出:输入向量 x 被投影到了权值向量 w 上。于是 x 在垂直于 w 的子空间中的信息全部丢失。所以如果用响应 y 作为分类依据,那么只能得到线性的分界面:p 维空间中的一个 p-1 维仿射集——超平面。如果自变量空间 2 维,分界面是一条直线。

「行知」从线性模型到神经网络

线性回归模型的图形。红色箭头是权值向量 w 的方向(长度做了缩放)。可看出, y 是 p+1 维空间中一个平面。它沿 w 方向倾斜。y 的等高线是垂直于 w 的直线。

「行知」从线性模型到神经网络

在线性回归基础上引入一个非线性的激活函数,比如 Logistic 函数(其图形是 Sigmoid 曲线)。输出 y 被 Logistic 函数压缩到 (0,1) 区间内。将 y 作为样本为正例的概率,使用交叉熵作为损失函数进行优化,使模型判断的某样本类别分布接近观察到的类别分布(正确的类别概率为 1 ,其余类别概率为 0)。从贝叶斯视角来看,这种优化也使样本的似然概率达到最大。这个模型其实就是逻辑回归模型。

「行知」从线性模型到神经网络

逻辑回归虽然在输出上施加了非线性的 Logistic 函数,但它仍不具备非线性分类能力。 x 在进入计算一开始就先向 w 方向做了投影。垂直于 w 的子空间上的信息仍然丢失了。和线性回归一样,逻辑回归只能得到线性分界面。所不同的是逻辑回归采用交叉熵损失函数,更适合分类问题。若想超越线性分类,则必须引入模型集成。

「行知」从线性模型到神经网络

搞 3 个逻辑回归,再将它们的输出线性组合(并加上偏置)就得到本页 PPT 展示的模型。该模型可视作 3 个逻辑回归的 ensemble ,具体来讲是 model stacking 。该模型也是一个两输入单输出、单隐藏层、隐藏层激活函数为 Logistic 、输出层无激活函数的 ANN 。回过头来,线性回归和逻辑回归其实是 p 输入单输出、无隐藏层、无激活函数或激活函数为 Logistic 的 ANN 。

「行知」从线性模型到神经网络

这样的模型可以形成非线性的分界面。要形成非线性分界面,网状结构和非线性激活函数缺一不可。如果缺乏网状结构(逻辑回归),x 经过投影其信息只在 w 方向上有变化。若缺乏非线性激活函数,则无论有多少层,网络仍然是一个线性回归。

「行知」从线性模型到神经网络

ANN 训练过程

https://github.com/zhangjuefei/mentat/blob/master/mentat/test/dnn_animation.py

「行知」从线性模型到神经网络

至此即可定义神经网络了。ReLu 虽然不像 Logistic 和 Tanh 那样“弯弯绕”,但是它单边扬起的形状足以在“网络+激活”条件下提供足够的拟合能力。

「行知」从线性模型到神经网络

ANN 的示意图以及计算式。那个圆符号表示对向量的每个元素施加 f 。

「行知」从线性模型到神经网络

自变量在某一点的梯度向量指向原函数一阶泰勒展开(近似平面)的上升方向。梯度的反方向就是该近似平面的下降方向,也是原函数在该点小局部内下降最快的方向。梯度下降法计算梯度,沿反方向行走一个小距离,再次计算梯度,重复此过程,迭代地寻找原函数的全局最小点。梯度向量的各元素是原函数对自变量各分量的偏导。

「行知」从线性模型到神经网络

如果把梯度场视作速度场,梯度下降其实就是数值模拟一点在相空间中的运动。好消息是:梯度场是保守场,原函数是该保守场的势能。保守场中的极小点是李雅普诺夫稳定的,且不存在奇异吸引子。坏消息是:该好消息无甚卵用。对于非凸函数,存在局部极小、鞍点等讨厌情况。梯度下降法有一些变体。它们在方向和步长上做文章,以求在非凸情况下尽可能加速和保证收敛。

「行知」从线性模型到神经网络

ANN 视权值和偏置为自变量,利用梯度下降最小化平均损失函数。对于回归问题,损失函数是样本的预测值和真实值之间欧式距离平方(2-范数)。对于多分类问题,常用的做法是将输出进行 softmax 后视作类别概率分布,然后最小化预测分布与观察分布的交叉熵。观察分布就是正确的类概率为 1 ,其余类概率为 0 。

「行知」从线性模型到神经网络

岔开话题简述交叉熵。K-L 散度衡量分布 p 与 q 之间的相似程度。p 与 q 的交叉熵等于 p 与 q 的 K-L 散度加上 p 的熵。在 ANN 分类训练中,p 是观察到的分布,q 是 ANN 预测的分布。 p 的熵为 0 ,故最小化交叉熵就是最小化 K-L 散度。这使 ANN 的预测分布与观察分布尽可能接近。同时交叉熵也是训练样本的对数似然(log likelihood)的相反数。

「行知」从线性模型到神经网络

反向传播。本页示意图是 ANN 的一部分。计算损失函数 L 对各权值 w 的偏导,最关键的是计算 L 对每一个神经元激活水平 v (输入经过线性组合,但还没有施加激活函数时那个值)的偏导,姑且叫 delta 。有了这些 delta ,每个权值的偏导就很容易计算了——就是该神经元的 delta 乘上权值所在边上当前的输入。有了后一层各个神经元的 delta ,前一层各神经元的 delta 也容易计算。就是本页下部的公式。这里建议将图中所示这部分计算分成 3 段,第一段是第 k 层某个神经元的激活水平 v 经过 f 到输出 x 的计算;第二段是第 k 层该神经元的输出 x 到 k+1 层各神经元激活水平 v 的计算;第三段是第 k+1 层各神经元激活水平 v 到最终损失函数 L 的计算。三个函数复合在一起。根据链式法则,L 对第 k 层那个神经元的 v 的导就是三个函数的导矩阵连乘。这里注意: m 到 n 的函数的导“数”其实是一个 n x m 矩阵,表示一个 m 到 n 的线性变换。此处更详细的推导请见:神经网络反向传播算法(https://zhuanlan.zhihu.com/p/25609953)

「行知」从线性模型到神经网络

至此,ANN 反向传播梯度下降的迭代公式就呼之欲出了。注意一点:对于分类问题,输出经 softmax 并以交叉熵为损失函数时,输出层神经元的 delta 计算推导稍复杂,但美妙的是结果的形式与损失函数是平方误差时是一致的,都是本页反向传播部分第一个式子。

「行知」从线性模型到神经网络

作者用 python 和线性代数库 numpy 实现了一个 ANN 。本页展示用它进行函数拟合的效果。

「行知」从线性模型到神经网络

这里有一个用 TnesorFlow 以三种方式搭建 ANN 进行 MNIST 字符识别的示例。代码请见:https://github.com/zhangjuefei/ann_presentation

「行知」从线性模型到神经网络

卷积神经网络 CNN 是一种非全连接的神经网络。其关键的卷积层可以视作可训练的滤波器。详情请见博文:卷积神经网络简介。

(https://zhuanlan.zhihu.com/p/25249694) 

「行知」从线性模型到神经网络

这张有点凑数了。做个广告,笔者有一个利用 python 、numpy 和 pandas 实现的机器学习库Mentat(https://github.com/zhangjuefei/mentat),敬请关注 。

最后一张,引用控制论祖师维纳在《人有人的用处》中的一句话。在这个浮躁的时代,与诸君共勉:

The future will be an ever more demanding struggle against the limitations of our intelligence, not a comfortable hammock in which we can lie down to be waited upon by our robot slaves.

-- Norbert Wiener “The Human Use Of Human Beings”

作者介绍:

张觉非,本科毕业于复旦大学,硕士毕业于中国科学院大学,先后任职于新浪微博、阿里,目前就职于奇虎360,任机器学习技术专家。

——END——

「行知」

让您的行业知识,为行业者知。

 

DataFun诚邀人工智能、大数据行业内的从业者、学者、爱好者,分享您的真知灼见,技术干货,并把您的这些经验、技术知识传递给更多的行业者,共同推动行业的发展。

 

来稿标准:

• 文稿为个人原创作品,来稿需注明作者信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上首发渠道及链接; 

• DataFun默认每篇文章都是原创,均会添加“原创”标志。

 

投稿邮箱:

• 投稿邮箱:hongfei@datafun.ltd 

• 请留下联系方式(微信或手机),以便我们及时和作者沟通。


关于社区:

DataFun定位于最实用的数据智能社区,主要形式为线下的深度沙龙、线上的内容整理。希望将工业界专家在各自场景下的实践经验,通过DataFun的平台传播和扩散,对即将或已经开始相关尝试的同学有启发和借鉴。

DataFun的愿景是:为大数据、人工智能从业者和爱好者打造一个分享、交流、学习、成长的平台,让数据科学领域的知识和经验更好的传播和落地产生价值。

DataFun社区成立至今,已经成功在全国范围内举办数十场线下技术沙龙,有近俩百位的业内专家参与分享,聚集了万余大数据、算法相关领域从业者。

看官点下「好看」再走呗!👇

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《「行知」从线性模型到神经网络》的版权归原作者「DataFunTalk」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

举报