最近小伙伴面试的时候,好多面试官都会问给定一个方程如何求解? 比如x + sinx + 1 = 0的, 小伙伴们大多都回答的用牛顿法或者用随机梯度下降, 当然面试官会问原理....
牛顿法和SGD作为最常见优化方法平时总是听到,也略知一二,除了在数值分析这门课上手动推过之后,再也没仔细研究过,平时用tensorflow都是自动优化的,所以我简单用实现了这两个优化方法加深理解.
先说牛顿法, 牛顿法是求解方程的方法!!而不是求极值的方法!!
牛顿法就是随机选一点带入方程,
比如对x + sinx + 1 =0来说, 我先随机选一点x0 = 0, 带入方程得到y0 = 1, 并计算在x0这一点的导数为2(导数1 + cosx), 然后根据(x0, y0), 以及这一点的导数, 求出和X轴的交点(x1, 0), 在把x1带入方程, 以此类推.
Xn+1 = Xn - f(Xn)/f'(Xn)
再说SGD, SDG是求极值的方法!!!直到没有导数那一点才停止,也就是极值点,这个就容易理解了,随机一点,向它的负导数方向寻找最小值(也可以说是损失函数的最优解),也就是x每次减去它的导数(再乘以学习率:步长).
再多说一点,只有凸函数才能用梯度下降找到极值点.
Xn+1 = Xn - learning_rate * delta
from math import *
import random
def Newton(x):
"""
用牛顿法对s+sinx+1=0求解
接收一个x,返回一个更接近解的新x
"""
y = func(x)
x_dev = derivative(x) # x这