【霏艺所思】神经网络的本质(草稿中。。。)
https://www.youtube.com/watch?v=jh9MvxjG0PA
结论:神经网络的本质是用来求“面积”的!
# 入门
y = x 是平面上一条直线。当x取值[0, 1]的时候,问直线和x轴所围成的三角形面积是多少?
方法1: 长 x 高 / 2 = 1x1/2 = 0.5
方法2: 先求y=x的积分函数 ,得到 Y = (1/2)x^2,把x=1 带入得到 0.5
方法3: 根据微积分的思想,把三角形划分成m个边长为n的正方形,面积等于nxnxm
当n足够小,则这个答案越逼近三角形面积
方法4: 画一个边长为1的正方形,随机在正方形里挑选一个点P,点P在三角形里的概率,就是三角形的面积。概率可以通过模拟得到。
方法4,是一种蒙特卡洛算法。蒙特卡洛的核心,就是用概率去逼近面积。
类似笛卡尔坐标【直角坐标系】,把代数和几何建立了“桥梁”
蒙特卡洛算法,把概率和微积分建立了“桥梁”,微积分问题都可以用对应的概率来模拟。
# 归一化
很多人会说,如果面积大于1怎么办?
根据相似的原理,nxn的正方形的面积是1x1的正方形面积的n²倍,所以把原来的图形,缩小n倍来处理
通过归一化,将一组数据缩小到 [0,1]之间,面积缩小了n²倍,这样概率=面积/n²
一般考虑问题,都会把问题归约到[0,1]之间的问题,用概率描述。
# 激活函数
当 点P落到三角形里的时候,称为激活,标记为1
如果落到三角形外面,则没有激活,标记为0
落到三角形的面积 = 激活的次数/总次数
问题在于怎么判定在P是不是在三角形里?
举个例子吧!!!
随便找了个点P(0.3, 0.1),在不在三角形里呢?
把x=0.3带入 y = x,得到 y = 0.3 比 0.1 大,所以P一定在三角形里。。。
然后把y = x 用 f(x) 表示【以后都用f(x)表示了】
激活函数记为 A(x)
A(x) = 1 if (f(x) -y) > 0 else 0
别问我为什么这里你们看不懂了。。。[哪怕不懂,也麻烦你们后面说不懂的地方,我来补充!]
总结,激活函数的意思,就是随机得到的点P在不在三角形里的判定函数
现在开始飙车:以后不用 y = x了,改成 y = f(x) 其中f(x) 表示任意曲线,不再是直线了!
因为f(x) 不是 直线了,所以 A(x) 必然也就不是直线了!
然后,大佬们就各自思考如何设计【非线性的激活函数】
最容易想到的就是 A(x) = x if x > 0 else 0
这个就是relu激活函数的由来!!!
至于sigmoid tanh 以及现在很火的 gelu
我日后解释下他们的由来吧。。。【草稿中,后续补充】
f(x)的面积 = 激活的概率 = 激活的次数/总次数
因为relu是最好理解的激活函数,同时计算量非常低,所以我更推荐用relu作为激活函数!
结论:神经网络的本质是用来求“面积”的!
# 入门
y = x 是平面上一条直线。当x取值[0, 1]的时候,问直线和x轴所围成的三角形面积是多少?
方法1: 长 x 高 / 2 = 1x1/2 = 0.5
方法2: 先求y=x的积分函数 ,得到 Y = (1/2)x^2,把x=1 带入得到 0.5
方法3: 根据微积分的思想,把三角形划分成m个边长为n的正方形,面积等于nxnxm
当n足够小,则这个答案越逼近三角形面积
方法4: 画一个边长为1的正方形,随机在正方形里挑选一个点P,点P在三角形里的概率,就是三角形的面积。概率可以通过模拟得到。
方法4,是一种蒙特卡洛算法。蒙特卡洛的核心,就是用概率去逼近面积。
类似笛卡尔坐标【直角坐标系】,把代数和几何建立了“桥梁”
蒙特卡洛算法,把概率和微积分建立了“桥梁”,微积分问题都可以用对应的概率来模拟。
# 归一化
很多人会说,如果面积大于1怎么办?
根据相似的原理,nxn的正方形的面积是1x1的正方形面积的n²倍,所以把原来的图形,缩小n倍来处理
通过归一化,将一组数据缩小到 [0,1]之间,面积缩小了n²倍,这样概率=面积/n²
一般考虑问题,都会把问题归约到[0,1]之间的问题,用概率描述。
# 激活函数
当 点P落到三角形里的时候,称为激活,标记为1
如果落到三角形外面,则没有激活,标记为0
落到三角形的面积 = 激活的次数/总次数
问题在于怎么判定在P是不是在三角形里?
举个例子吧!!!
随便找了个点P(0.3, 0.1),在不在三角形里呢?
把x=0.3带入 y = x,得到 y = 0.3 比 0.1 大,所以P一定在三角形里。。。
然后把y = x 用 f(x) 表示【以后都用f(x)表示了】
激活函数记为 A(x)
A(x) = 1 if (f(x) -y) > 0 else 0
别问我为什么这里你们看不懂了。。。[哪怕不懂,也麻烦你们后面说不懂的地方,我来补充!]
总结,激活函数的意思,就是随机得到的点P在不在三角形里的判定函数
现在开始飙车:以后不用 y = x了,改成 y = f(x) 其中f(x) 表示任意曲线,不再是直线了!
因为f(x) 不是 直线了,所以 A(x) 必然也就不是直线了!
然后,大佬们就各自思考如何设计【非线性的激活函数】
最容易想到的就是 A(x) = x if x > 0 else 0
这个就是relu激活函数的由来!!!
至于sigmoid tanh 以及现在很火的 gelu
我日后解释下他们的由来吧。。。【草稿中,后续补充】
f(x)的面积 = 激活的概率 = 激活的次数/总次数
因为relu是最好理解的激活函数,同时计算量非常低,所以我更推荐用relu作为激活函数!
8 个评论
感谢文章,神经网络还没有好好学过,窝有一些机器学习的基础,现在自学应该去哪里看呢,Coursera如何?
窝觉得不管Coursera还是其他的网课都有一个问题,虽然讲的其实都很不错,但是课后练习和项目太少,也没有考试,总感觉自己学的没什么积极性,大概刷了视频过去就自我满足了,其实还有好多不会。
# 全连接
现在假设 x^2+y^2 = 1 是一个圆,记为f(x,y)
我想计算 这个圆在第一象限的面积!我知道答案是 Pi/4
怎么做呢?
步骤如下:
1. 在圆上 随机选择一个点P
2. 在点P上画一条 切线 L
3.计算 L 和 x轴,y轴 相交的得到的三角形的面积
4. 重复 上面的操作,计算两个 三角形的面积的交集
5. 重复 n 次 ,得到 这些三角形 面积的交集
当 n 无限大的时候,则 面积的交集 就是 这个 1/4圆的面积了!
别问我为什么这里你们看不懂了。。。[哪怕不懂,也麻烦你们后面说不懂的地方,我来补充!]
因为切线是直线,所以 切线可以用 y = w*x + b来表示
比如我们选择了第一条切线y = w1 * x +b1
第二条 是y = w2 * x * b2
然后我们得到了n条切线
y = w1 * x + b1
y = w2 * x + b2
。。。
y = wn * x + bn
因为我们觉得这样写好麻烦
所以把(w1,w2,...wn)记为 向量 W,同理b记为 向量B
得到
y = W*x + B
因为 需要随机选择的点P都在三角形里(使用我们上面说到的激活函数)
所以
A(x) = 1 if (W*x + B) > y else 0
明白了么?
一维的全连接 = n条切线 所包围的图形的面积!
构成这个图形的曲线,我们取个名字叫特征函数
现在,我想求n个特征函数的面积!
所以把y和x也向量化吧,得到了
Y = W*X + B
所以 权重矩阵W 的 行表示有n条切线,列数m表示多少个特征函数的面积
当然了切线越多,对面积的逼近约准确,精度越高,但是运算量也越大
所以,现在很少有增加切线的神经网络,所以你们在使用全连接的时候,会发现很少使用,往往出现在最后几层计算
现在的主流是增加对特征函数的寻找上
# 卷积层
其实卷积层,和上面的全连接层是类似的
我日后解释下卷积层的由来吧。。。【草稿中,后续补充】
全连接层 的权重W矩阵 是 行 x 高 = 切线的数量 x 特征的数量
因为 切线的数量越高,对特征函数的拟合度越高,所以按理应该增加切线数量来提高精度
但是,这样会增加大量的计算量!
所以会限制切线的数量!
反而更加特征数量!
问题来了,如何从现有的曲线里增加特征数量呢?
这个就是卷积层的价值了
通过卷积核,来生成我需要的特征数量!
举个例子 3x3的卷积核,可以理解为 用3条切线,得到了3个特征!
增加卷积核越多,发现的特征越多!
但是这里的切线不再是直线了
应该是
ax^3 + bx^2 + cx +d = 0
ex^3 + fx^2 + gx +h = 0
ix^3 + jx^2 + kx +l = 0
大概就是这样了,用不是直线的曲线去切出特征向量。。。。
下次说具体点好了
的确打字表达很难。。。画图就好理解多了!
总结就是卷积核就是一个 “筛子”,只有符合“筛子”形状的曲线才能 激活
否则不激活,激活得到的曲线,就是新的特征曲线
用全连接,去计算得到的新的特征曲线,就和前面连起来了
特征越多,对计算面积的精度帮助越大
所以需要构造尽可能多的特征,通过卷积核,来人为构造特征
特征尽可能要少些,否则计算量太大,一个是内存/显存不够用
另一方面,是费时间
如何挑选特征,就是看图形!形状越丰富越好!把没有现状的特征都剔除!
只能意会,我也只能怎么给建议。。。
就是每次使用卷积层以后,看看输出结果长什么样,然后把自己不喜欢的删了。。。
现在假设 x^2+y^2 = 1 是一个圆,记为f(x,y)
我想计算 这个圆在第一象限的面积!我知道答案是 Pi/4
怎么做呢?
步骤如下:
1. 在圆上 随机选择一个点P
2. 在点P上画一条 切线 L
3.计算 L 和 x轴,y轴 相交的得到的三角形的面积
4. 重复 上面的操作,计算两个 三角形的面积的交集
5. 重复 n 次 ,得到 这些三角形 面积的交集
当 n 无限大的时候,则 面积的交集 就是 这个 1/4圆的面积了!
别问我为什么这里你们看不懂了。。。[哪怕不懂,也麻烦你们后面说不懂的地方,我来补充!]
因为切线是直线,所以 切线可以用 y = w*x + b来表示
比如我们选择了第一条切线y = w1 * x +b1
第二条 是y = w2 * x * b2
然后我们得到了n条切线
y = w1 * x + b1
y = w2 * x + b2
。。。
y = wn * x + bn
因为我们觉得这样写好麻烦
所以把(w1,w2,...wn)记为 向量 W,同理b记为 向量B
得到
y = W*x + B
因为 需要随机选择的点P都在三角形里(使用我们上面说到的激活函数)
所以
A(x) = 1 if (W*x + B) > y else 0
明白了么?
一维的全连接 = n条切线 所包围的图形的面积!
构成这个图形的曲线,我们取个名字叫特征函数
现在,我想求n个特征函数的面积!
所以把y和x也向量化吧,得到了
Y = W*X + B
所以 权重矩阵W 的 行表示有n条切线,列数m表示多少个特征函数的面积
当然了切线越多,对面积的逼近约准确,精度越高,但是运算量也越大
所以,现在很少有增加切线的神经网络,所以你们在使用全连接的时候,会发现很少使用,往往出现在最后几层计算
现在的主流是增加对特征函数的寻找上
# 卷积层
其实卷积层,和上面的全连接层是类似的
我日后解释下卷积层的由来吧。。。【草稿中,后续补充】
全连接层 的权重W矩阵 是 行 x 高 = 切线的数量 x 特征的数量
因为 切线的数量越高,对特征函数的拟合度越高,所以按理应该增加切线数量来提高精度
但是,这样会增加大量的计算量!
所以会限制切线的数量!
反而更加特征数量!
问题来了,如何从现有的曲线里增加特征数量呢?
这个就是卷积层的价值了
通过卷积核,来生成我需要的特征数量!
举个例子 3x3的卷积核,可以理解为 用3条切线,得到了3个特征!
增加卷积核越多,发现的特征越多!
但是这里的切线不再是直线了
应该是
ax^3 + bx^2 + cx +d = 0
ex^3 + fx^2 + gx +h = 0
ix^3 + jx^2 + kx +l = 0
大概就是这样了,用不是直线的曲线去切出特征向量。。。。
下次说具体点好了
的确打字表达很难。。。画图就好理解多了!
总结就是卷积核就是一个 “筛子”,只有符合“筛子”形状的曲线才能 激活
否则不激活,激活得到的曲线,就是新的特征曲线
用全连接,去计算得到的新的特征曲线,就和前面连起来了
特征越多,对计算面积的精度帮助越大
所以需要构造尽可能多的特征,通过卷积核,来人为构造特征
特征尽可能要少些,否则计算量太大,一个是内存/显存不够用
另一方面,是费时间
如何挑选特征,就是看图形!形状越丰富越好!把没有现状的特征都剔除!
只能意会,我也只能怎么给建议。。。
就是每次使用卷积层以后,看看输出结果长什么样,然后把自己不喜欢的删了。。。
回到train上了
# 损失函数
前面说的的,都是我们知道了f(x,y)这个曲线,求面积
现在反过来,我们只知道面积,如何求f(x,y)呢?
我们来学习拟合算法
因为我们知道 每一层的结构都是 y = wx+b
所以求曲线的问题,等于我们知道 y 和x 的情况下,求 w和b的值
如何去拟合呢 ?
保证 x带入拟合公式以后 sigma(y_real - y_predict)²的值最小
也就是方差最小的时候,拟合度最高,这个方法叫MSE
用这个方法的损失函数叫MSELoss
为什么叫损失函数呢?因为它表达了我们的拟合结果和真实结果的损失!(方差是干嘛的你们总知道吧)
我们希望损失尽可能小!(方差越小,表示拟合度越高)
如果是x为向量的情况,则希望每个向量的拟合度尽可能高,也就是交叉熵
细说交叉熵,又来不及讲了。。。
# 优化器
我们的目标是loss函数尽可能小
那么如何去加速知道w和b的值呢?
很简单啊!
loss的最小值,肯定是 斜率为0 的时候,对不对?
举个例子 ,y = x²
问,这个函数的最小值是多少? 是不是斜率(导数)为0 的时候?
因为导数 > 0 必然 向右的时候,y会变大
导数 < 0 必然,向右的时候, y会变小
所以 导数 = 0 必然 是 极值点
===
为什么用 y = x²举例呢?因为 你把 mseloss 展开来看,就是一个 y = Kx² + balabala的一个函数。。。
所以 ,当我们要求mseloss的最小值的时候,就会用导数【梯度】为0的特性来计算
如果梯度,大于0 则向左更新,否则向右更新,如果是0,则找到了极值点
这个方法叫梯度下降,自然有更好的梯度下降算法
比如随机梯度下降(sgd)
除了sgd,还有Adam这类的明星优化器!
日后展开继续吧
# 额外补充
过拟合问题
什么叫过拟合?就是井底之蛙的意思!
比如,某人在中国呆了一辈子,以为全人类都是说中文的,不知道外面还有人说英语,日语
再比如,某人觉得全人类吃饭都用刀叉,却不知道中国人用筷子,印度人用手抓。。。
过拟合就是,train的时候,只考虑了某个子训练集,而在其他训练集的情况下表现很差
就是以样本 去 评估 全局,样本里表现虽然很好,但是全局表现很差
解决办法,Dropout 或者 Batch Norm层
---
梯度消失问题
因为网络深度加深了 ,导致 0.x的 n 次方 ,无限逼近0
怎么解决呢?就是深度残差网络了。。。
下一期:
我再讲下自注意力机制
transformer和BERT 还有他们的激活函数gelu
# 损失函数
前面说的的,都是我们知道了f(x,y)这个曲线,求面积
现在反过来,我们只知道面积,如何求f(x,y)呢?
我们来学习拟合算法
因为我们知道 每一层的结构都是 y = wx+b
所以求曲线的问题,等于我们知道 y 和x 的情况下,求 w和b的值
如何去拟合呢 ?
保证 x带入拟合公式以后 sigma(y_real - y_predict)²的值最小
也就是方差最小的时候,拟合度最高,这个方法叫MSE
用这个方法的损失函数叫MSELoss
为什么叫损失函数呢?因为它表达了我们的拟合结果和真实结果的损失!(方差是干嘛的你们总知道吧)
我们希望损失尽可能小!(方差越小,表示拟合度越高)
如果是x为向量的情况,则希望每个向量的拟合度尽可能高,也就是交叉熵
细说交叉熵,又来不及讲了。。。
# 优化器
我们的目标是loss函数尽可能小
那么如何去加速知道w和b的值呢?
很简单啊!
loss的最小值,肯定是 斜率为0 的时候,对不对?
举个例子 ,y = x²
问,这个函数的最小值是多少? 是不是斜率(导数)为0 的时候?
因为导数 > 0 必然 向右的时候,y会变大
导数 < 0 必然,向右的时候, y会变小
所以 导数 = 0 必然 是 极值点
===
为什么用 y = x²举例呢?因为 你把 mseloss 展开来看,就是一个 y = Kx² + balabala的一个函数。。。
所以 ,当我们要求mseloss的最小值的时候,就会用导数【梯度】为0的特性来计算
如果梯度,大于0 则向左更新,否则向右更新,如果是0,则找到了极值点
这个方法叫梯度下降,自然有更好的梯度下降算法
比如随机梯度下降(sgd)
除了sgd,还有Adam这类的明星优化器!
日后展开继续吧
# 额外补充
过拟合问题
什么叫过拟合?就是井底之蛙的意思!
比如,某人在中国呆了一辈子,以为全人类都是说中文的,不知道外面还有人说英语,日语
再比如,某人觉得全人类吃饭都用刀叉,却不知道中国人用筷子,印度人用手抓。。。
过拟合就是,train的时候,只考虑了某个子训练集,而在其他训练集的情况下表现很差
就是以样本 去 评估 全局,样本里表现虽然很好,但是全局表现很差
解决办法,Dropout 或者 Batch Norm层
---
梯度消失问题
因为网络深度加深了 ,导致 0.x的 n 次方 ,无限逼近0
怎么解决呢?就是深度残差网络了。。。
下一期:
我再讲下自注意力机制
transformer和BERT 还有他们的激活函数gelu
本文的目的是告诉初学者,神经网络的数学解释含义
否则就和瞎猜一样了,没有目的和方向
我觉得靠作业和考试来巩固知识是落后的。
应该要自己去探索和实验,自己的主动才是价值。
我给的建议就是刷kaggle
初学者,没有必要上cuda,搞很大的模型
先从基本的数据模型开始,找些小的训练集,慢慢训练,自己摸索下
我觉得matlab上的demo看一遍比这些公开课有用多了
否则就和瞎猜一样了,没有目的和方向
我觉得靠作业和考试来巩固知识是落后的。
应该要自己去探索和实验,自己的主动才是价值。
我给的建议就是刷kaggle
初学者,没有必要上cuda,搞很大的模型
先从基本的数据模型开始,找些小的训练集,慢慢训练,自己摸索下
我觉得matlab上的demo看一遍比这些公开课有用多了
窝觉得不管Coursera还是其他的网课都有一个问题,虽然讲的其实都很不错,但是课后练习和项目太少,...
andrew ng的課看過了嗎?
我竟然在品葱学习。
可以理解为牛顿迭代法的复杂版本,控制论里也有类似的概念,闭环控制。
不过我对这种复杂度高的东西不太感冒,吃瓜…
不过我对这种复杂度高的东西不太感冒,吃瓜…