1 参悟深度学习-梯度下降法

数学知识

导函数

本质上梯度下降法是在解决极值的问题

而在数学上求极值,需要知道导函数 就很容易求的 比如

函数 y = x^2 + 4x + 4 的最大/小值是在其导函数等于0时的x的值 即 2*x + 4 = 0 是 x=-2 存在最大/小值 y=0

image.jpeg

导函数的公式

f(x) = 4                          f(x)’= 0 

f(x) = 2x                        f(x)’= 2 

f(x) = x^2                      f(x)’= 2x 

f(x) = x^3                      f(x)’= 3x^2 

f(x) = 4x^2 + 2x + 5     f(x)’= 8x + 2 

链式法则

这个是一个非常重要法则

求函数  f(x) = 4(x + 2)^2的导函数 

设 z(x) = x + 2 则 f(x) = f(z(x)) = 4z^2 则 

f(x)’= f(z(x))’* z’= 8*z * (1) = 8*(x + 2) = 8x + 16 

使用链式法则 能使求导变得很简单

偏导数

如果一个函数有两个未知数x, y那么就有个两个导函数,分别关于x,y的 求法其实很简单 把另一个当作没看见就好 例如

f(x, y) = 4x^2 + 5 x y + 6y^2 

x的偏导数 = 8x + 5y 

y的偏导数 = 12y + 5x 

矩阵及其乘法

假设

nx = ax + by + t1 

ny = cx + dy + t2 

那么可以用矩阵表示为

image.jpeg
假设矩阵[a, b, c, d]为K,[x, y]为X,[t1, t2]为B, [nx, ny]为Y那么上面的等式为 

KX+B=Y 

一个m行z列的矩阵A 乘以一个 z行n列的矩阵B得到的矩阵为m行n列 即:

m x z @ z x n = m x n  

意味着 两个矩阵相乘 必须是前面的列数等于后面的行数

意味着 矩阵乘法不满足交换律

示例如下 前一个的行乘以后一个的列作为某个元素

image.jpeg

梯度下降法

如果求函数y = x^2 + 4x + 4 的极值

那么当2x+4=0时,x处就是函数的极值

当然还有一种方式。就是我们把x从-10,10的整数依次代入上面的函数中 然后得到当x=-2时 y的值最小为0,而梯度下降法与这种方式类似 下图是使用梯度下降法求极值

image.jpeg

起先x设置为0,循环一百次,每次上次的基础上减去 0.1乘以其导数 输出如下

image.jpeg

x起始值可以是任意的,同样的0.1 可以是任意小于1的正小数,最终输出趋于-2

一般地 0.1称之为学习率

为什么循环,直接求方程2x+4=0啊 只能说年少轻狂。。。

为什么要减去其导数,参看牛顿法求极值‘

总而言之,它很重要,奠定了机器学习的基础,也能解决实际中的不少问题

应用示例

直线逼近

理想中两个点确定了一条直线,但现实是给了一堆点来确定一条直线

设这条直线是 kx + b = y 使得 (y - (kx + b))^2 的值最小

已知 x1, x2, x3, y1, y2, y3 求k和b 函数是((kx + b) - y)^2 

k的偏导数是 2((kx + b) - y) * x 

b的偏导数是 2((kx + b) - y) 

示例代码如下:

image.jpeg
image.jpeg

循环100次之后发现 基本上求出k和b了 也可以把k,b的误差打印出来

image.jpeg

输出如下:

image.jpeg

2D矩阵逼近

在2d平面中的(x,y)变换成一个新的点(u, v) 则

(u = ax + by + t1, v = cx + dy + t2)  

由参数a,b, c,d,t1, t2组成了2d的变换矩阵

求一个变换矩阵 使得满足(x1, y1), (x2, y2), (x3, y3) … 变换后的点为(u1, v1), (u2, v2), (u3, v3) ….

设 u = ax + by + t1, v = cx + by + t2求参数 a, b, c, d, t1, t2使得((ax + by + t1) - u)^2 和 ((cx + dy + t2) - v) ^2 在极值处 

a’ = 2((ax + by + t1) - u) * x 

b’ = 2((ax + by + t1) - u) * y 

c’ = 2((cx + dy + t2) - v) * x 

d’ = 2((cx + dy + t2) - v) * y 

t1’ = 2((ax + by + t1) - u)  

t2’ = 2((cx + dy + t2) - v) 

示例代码如下:

image.jpeg

这里使用矩阵W来表示参数(a, b, c, d), 矩阵T来表示参数(t1, t2) 使用矩阵的乘法和加法大大的节省了代码量

image.jpeg

3D矩阵逼近

了解了2D的矩阵,那么3D的矩阵也同理

u = ax + by + cz + t1 

v = ex + fy + gz + t2 

w = hx + iy + jz + t3 

只是参数变成了12个 其中W包含9个 加上 T的3个 那么代码如下

image.jpeg

输出如下:

image.jpeg

总结

在上面示例中 更新参数时 减去当前参数的偏导数,偏导数也称之为是该参数的梯度

这种函数 (kx+b - y)^2 称之为损失函数

更新参数的时候 是减去 学习率 x 梯度,而不是加上 学习率 x 梯度,为什么?如果是加上 那么损失函数应该是(y - (kx + b))^2, 但是在牛顿法中用的是减号,在上面的求抛物线y=x^2 + 4x + 4中使用加号的话 求不出来极值。。。

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

你可能感兴趣的:(1 参悟深度学习-梯度下降法)