本文翻译自 程序员
Neural Networks : A 30,000 Feet View for Beginners算法
翻译:coneypo数组
在这篇文章中,我会向你们简要的介绍下 Neural Networks / 神经网络;浏览器
能够做为 Machine Learning / 机器学习 和 Deep Learning / 深度学习 的入门爱好者参考;网络
咱们文章中会尽可能用简短的,零基础的方式来向你们介绍。架构
咱们能够把神经网络看成一个神奇的黑盒子,你没必要知道黑盒子里面是什么;机器学习
你如今只知道黑盒有 一个输入 和 三个输出;函数
输入能够是图像的尺寸,颜色或者种类等等;学习
输出分别为 "猫","狗",和 "其余" 三种标签,标签的输出值都是介于 0~1,并且三种标签的数值之和为 1。测试
黑盒的神奇之处其实很简单,若是你向它输入一张图像,它会输出三个数值;
一个理想化的完美神经网络,对于 "猫" 输出(1,0,0),对于 "狗" 输出(0,1,0),对于 "其余" 输出(0,0,1);
事实上即便一个训练的很是好的神经网络也可能达不到上述的完美输出;
好比,若是你输出一张猫的图像,”猫” 标签输出的数值为 0.97,“狗” 标签下的输出数值为 0.01,“其余” 标签下的输出数值为 0.02。
输出数值 能够理解为 可能性几率;
好比说黑盒 "认为" 这张图像是 "猫" 的几率是 97%,很小的几率是 "狗" 或者是 "其余" 物种;
请注意输出数值之和必定为 1;
具体的这种问题归类于 image classification / 图像分类 问题:给定一张图像,你用最有可能的标签去给图像进行分类(猫,狗,或者其余);
如今你做为一名程序员,你可使用数值来表示神经网络的输出;
可是你如何输入一张图像呢?
图像其实就是一个存放数值的数组。一个 256*256 三通道的图像其实就是 256*256*3=196608 个数值;
你使用图片浏览器来浏览 256*256 大小的图片,其实在内存里就是 196608 个数值构成的 continuous block / 连续块;
通过上述描述,咱们知道输入有一点复杂,输入实际上有 196608 个数值,咱们由此更新一下咱们的黑盒模型。
我知道你在想什么,若是图像不是 256*256 的呢?
其实你能够经过如下步骤来把任何一张图像转换为 256*256 大小:
你们使用不少不一样种类的方法来转换图像到一个适合的尺寸( 好比 256*256 ),可是正如我以前所说,我会让咱们的流程变得简单,我不会使用这些各类各样的方法。须要注意的事情是任何一张图像能够被转换成你想要的尺寸,即便咱们在裁剪或者调整大小的时候丢掉一些信息。
黑盒模型有一些 knobs / 旋钮 来调整模型参数;
从技术角度来讲,这些旋钮称之为 weights / 权重;
当这些旋钮处于正确的位置,神经网络就能够达到更好更正确的输出结果;
训练神经网络就是要找到正确的 旋钮设置 / 权重;
若是你有一个黑盒,可是不知道正确的旋钮设置,那么这个黑盒其实至关于没用的;
好消息是你能够经过训练神经网络来找到正确的旋钮设置。
训练神经网络和训练小孩特别像。你拿一个球给小孩看,而后告诉他这是一个球;
当你给他看了不少种球以后,小孩就会弄明白,球和球的形状有关,与它的颜色或者尺寸无关;
而后你给小孩一个鸡蛋,问他这是什么,他回答是球。你纠正他这不是球,这是鸡蛋;
当这个过程重复几回以后,这个小孩就能够辨别球和鸡蛋了。
为了训练一个神经网络,你给它几千个想让它学习的分类例子(好比猫,狗或者其余);
这种训练称之为 Supervised Learning / 监督学习,由于你提供给这个神经网络来自某个分类的图像,而后确切的告诉它,这张图像来自这个分类;
为了训练神经网络,咱们须要三件事情:
1. Training data / 训练数据:
各类分类的数千张图像和它们期待的输出;
好比全部猫的图像,被期待输出为(1,0,0);
2. Cost function / 损失函数:
咱们须要知道当前的权值设置是否比以前的设置要更好;
损失函数会统计训练集中全部图像通过神经网络处理的错误信息;
经常使用的损失函数被称为 sum of squared errors (SSE) / 平方偏差和;
对于一张图像,你期待的输出是一只猫或者(1,0,0),神经网络的实际输出是(0.37,0.5,0.13),
平方损失会计算出全部图像的损失,都会被简化为平方偏差之和;
训练的目的就是找到合适按钮设置(权重)达到最小化损失函数的目的。
3. How to update the knob setting / 如何调整权重:
最后咱们须要根据观察训练图像的错误数据,来更新神经网络的权重;
咱们如今有一千张猫的图像,一千张狗的图像,和一千张随机的物体不是猫也不是狗,这三千张图像就是咱们的训练集;
若是神经网络尚未被训练,内部的权值是随机的,当你将三千张图像输入神经网络,获得输出的准确率为 1/3 ;
为了简化流程,咱们的神经网络只有一个旋钮权值。因为咱们已经仅仅有一个权值,咱们能够测试一千种不一样的权值测试,来找到能够最小化损失函数最好的权值设置。这样就完成了咱们的训练;
然而,事实上神经网络不只仅有一个旋钮权值,以流行的神经网络 VGG-Net 为例,它有 1.38 亿 个旋钮权值。
刚才咱们用一个旋钮来训练神经网络,在测试完全部可能性(可能数量很大)以后,咱们能够找到最好的参数设置;
这有点不切实际,由于若是三个旋钮权值,咱们就要测试十亿次;
很明显这种暴力搜索方式是不切实际的;
幸运的是,有一种解决方法,当损失函数是 convex function / 凸函数 时(看起来像一个碗);
咱们能够用 Gradient Descent / 梯度降低 的方式来迭代找到最好的权重;
让咱们回到只有一个权值的神经网络,而且假设咱们如今的旋钮设置(或者权值)是 ;
若是咱们的损失函数像一个碗,咱们能够找到损失函数的斜率,而后一步步移到最佳的旋钮设置 , 这个过程称为 梯度降低;
由于咱们根据斜率(或者 Gradient / 梯度)逐渐向下移动( Descending / 降低 ),当咱们到达损失函数碗的底部,梯度或者斜率会变成零,而后完成你的训练;
这些碗形状的函数被称之为 convex functions / 凸函数。
可是第一次是如何估计?你能够选择一个随机数;
Note:当你使用一些流行的神经网络架构,好比 GoogleNet 或者 VGG-Net,你可使用基于 ImageNet 训练的权重,而不是选择随机的初始权值,这样能够收敛的更快。
当有多个旋钮时,梯度降低也是类似的工做原理;
好比当有两个旋钮时,损失函数在 3D 坐标中看起来像一个碗同样;
若是你把一个球放到这个碗的任何位置,球会沿着 the maximum downward slope / 最大降低斜率 滚到碗的底部,这也是梯度降低工做的原理;
若是你让球以全速滚下去,它会到达底部,可是因为惯性和动能,还会继续向上滚动,最终停在底部;
可是若是给这个球下落的时候增长约束条件,让它更慢的降低,到达底部以后就不会再上升了,其实会花费更少的时间来达到底部;
实际上当咱们训练一个神经网络的时候,咱们使用一个参数 learning rate / 学习率 来控制收敛速度;
当咱们有不少个纽扣(权重)时,损失函数的形状在更高维的空间,依然是一个碗形。虽然这时候这个碗很难去可视化观测,可是斜率和梯度降低依然能够工做;
所以梯度降低提供了一个很好的找到最小损失函数解决方案。
有一个问题,知道了当前的权值设置,咱们怎么知道损失函数的斜率?
损失函数的梯度取决于训练集中,真实输出和当前输出的差异;
换句话说,训练集的每张图像,若是神经网络在这些图像上表现的差,都会最终的梯度计算都有贡献。
用来估计损失函数的梯度的算法,被称为 Backpropagation / 逆传播。
咱们会在未来的文章中介绍逆传播。
# 英文版权 @
# 翻译中文版权 @ coneypo
# 转载请注明出处