数学知识
导函数
本质上梯度下降法是在解决极值的问题
而在数学上求极值,需要知道导函数 就很容易求的 比如
函数 y = x^2 + 4x + 4 的最大/小值是在其导函数等于0时的x的值 即 2*x + 4 = 0 是 x=-2 存在最大/小值 y=0
导函数的公式
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
那么可以用矩阵表示为
假设矩阵[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
意味着 两个矩阵相乘 必须是前面的列数等于后面的行数
意味着 矩阵乘法不满足交换律
示例如下 前一个的行乘以后一个的列作为某个元素
梯度下降法
如果求函数y = x^2 + 4x + 4 的极值
那么当2x+4=0时,x处就是函数的极值
当然还有一种方式。就是我们把x从-10,10的整数依次代入上面的函数中 然后得到当x=-2时 y的值最小为0,而梯度下降法与这种方式类似 下图是使用梯度下降法求极值
起先x设置为0,循环一百次,每次上次的基础上减去 0.1乘以其导数 输出如下
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)
示例代码如下:
循环100次之后发现 基本上求出k和b了 也可以把k,b的误差打印出来
输出如下:
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)
示例代码如下:
这里使用矩阵W来表示参数(a, b, c, d), 矩阵T来表示参数(t1, t2) 使用矩阵的乘法和加法大大的节省了代码量
3D矩阵逼近
了解了2D的矩阵,那么3D的矩阵也同理
u = ax + by + cz + t1
v = ex + fy + gz + t2
w = hx + iy + jz + t3
只是参数变成了12个 其中W包含9个 加上 T的3个 那么代码如下
输出如下:
总结
在上面示例中 更新参数时 减去当前参数的偏导数,偏导数也称之为是该参数的梯度
这种函数 (kx+b - y)^2 称之为损失函数
更新参数的时候 是减去 学习率 x 梯度,而不是加上 学习率 x 梯度,为什么?如果是加上 那么损失函数应该是(y - (kx + b))^2, 但是在牛顿法中用的是减号,在上面的求抛物线y=x^2 + 4x + 4中使用加号的话 求不出来极值。。。