2 参悟深度学习-激活函数

数学知识

二元一次不等式

当点A(x, y) 满足 y > kx + b 时 A在直线kx+b上半部分 

当点A(x, y) 满足 y = kx + b 时 A在直线kx+b上 

当点A(x, y) 满足 y < kx + b 时 A在直线kx+b下半部分 

tanh函数

函数及其导函数的 图像和数学表达式如下

image.jpeg
image.jpeg

复合函数的导数

[g(x) * f(x)]′ = g′(x) f(x) + g(x) f′(x) 

[g(x) / f(x)]’ = ( g’(x)f(x) - g(x)f(x) ) / ( f(x)^2 )  

参看微积分的求导法则

激活函数

还没有悟出来,先看下面的例子吧

示例

线性二分类问题

假设数据集(x1, y1), (x2, y2) …. 是线性可分的,对应的标签为l(1, -1, …),求划分直线kx+b

损失函数是什么?((kx+b) - y)^2?

显然不是,因为最终输出的是1,-1的数字。k和b是未知数,

求得k,b需要知道其梯度,而梯度又是靠损失函数得来的

根据上面的二元一次不等式的性质,设置一个函数

f(z) => return z >= 0 ? 1 : -1 

设z=kx+b-y, 那么损失函数为 (f(z) - l)^2

这里 f(z)称之为激活函数,有了它就把k和b参数关联到标签l上了

但是 f(z) 返回值是常数(1或-1),而常数的导数是0, 很难求到偏导数。。。

迂回地,使用上面的tanh函数来代替这里的f(z)。。。因为它们的性质相同,大于0时偏于1,小于0时偏于-1,tanh有导函数

如此便是:

(k, b)’= ((tanh(z) - l)^2)’ 

令 f1 = tanh(z) - l 则  

(k, b)’= 2 * f1 * f1’ 

  = 2 * (tanh(z) - l) * (tanh(z) - l)’ 

  = 2 * (tanh(z) - l) * tanh(z)’ 

  = 2 * (tanh(z) - l) * dtanh(z) * (z)’ 

(k)’= 2*(tanh(z) - l) * dtanh(z) * x 

(b)’= 2*(tanh(z) - l) * dtanh(z) 

这里全靠链式法则推导,心里没什么谱。。。。

示例代码如下:

image.jpeg

结果如下

image.jpeg

2D平面中的点投影直线的问题

假设(x1, y1),(x2, y2) … 通过变换矩阵得到新的点(u1,v1), (u2, v2) ….

可以通过梯度下降法求出这个变换矩阵,然而这个杀千刀的在结果里边把v丢掉了 给的数字是 (u1/v1), (u2/v2)… 然后去求变换矩阵。。。

这里的激活函数是 f(nx, ny) = nx/ny

损失函数 依然是 (f(nx, ny) - l)^2

求的参数是 a, b, c, d, t1, t2

nx = ax + by + t1 

ny = cx + dy + t2 

(nx/ny - l)^2’ 

= 2(nx/ny - l) * (nx/ny - l)’ 

= 2(nx/ny - l) * 1 * (nx/ny)’ 

= 2(nx/ny - l) * (nx’ny - ny nx’)/(ny ny) 

设 c = 2(nx/ny - l) / (ny ny) 则各个参数的偏导数为:


a’ = c * ny x 

b’ = c * ny y 

c’ = c * (-nx x) 

d’ = c * (-nx y) 

t1’= c*ny 

t2’= c*(-nx) 

示例代码如下:

image.jpeg
image.jpeg

运行结果如下

image.jpeg

3D空间的点投影到2D平面的问题

3维空间中的点P3(x, y, z) 呈现到2D平面上P2(x0, y0),其过程是 变换矩阵M乘以P3得到 NP3,然后做一次齐次变换,即NP3点各个分量除以NP3的z,其x和y就是屏幕上点

已知3维空间的点集合D3 和 映射到平面上点集合D2 求变换矩阵M

一般地,变换矩阵是 4x4 16个数字数字 其实有用的是其中的12个,如下变换后的新点的坐标为:

nx = ax + by + cz + t1 

ny = ex + fy + gz + t2 

nx = ix + jy + kz + t3 

齐次变换之后的2D的点为:


x0 = nx / nz 

y0 = ny / nz 

这里的激活函数有两个 nx / nz 和 ny / nz

损失函数是 (x0 - l[0])^2 + (y[0] - l[1])^2

则导函数为:

((x0 - l[0])^2 + (y[0] - l[1])^2)’ =  

 2(nx/nz - l[0])/(nz*nz) * (nx' nz - nx nz') +  

 2(ny/nz - l[1])/(nz*nz) * (ny' nz - ny nz') 

c1 = 2(nx/nz - l[0])/(nz * nz) 

c2 = 2(ny/nz - l[0])/(nz * nz) 

则各个参数的偏导为: 

a' = c1 * nz * x 

b' = c1 * nz * y 

c' = c1 * nz * z 

e' = c2 * nz * x 

f' = c2 * nz * y 

g' = c2 * nz * z  

i' = (c1 * -nx + c2 * -ny) * x 

j' = (c1 * -nx + c2 * -ny) * y 

k' = (c1 * -nx + c2 * -ny) * z 

t1' =  c1 * nz 

t2' =  c2 * nz 

t3' =  (c1 * -nx + c2 * -ny) 

示例代码如下:

image.jpeg
image.jpeg

运行结果如下:

image.jpeg

首页 https://www.jianshu.com/p/92810c3a2d0e

你可能感兴趣的:(2 参悟深度学习-激活函数)