营销型网站建设明细报,免费wordpress商城主题下载地址,淮北市矿业工程建设公司网站,游戏网页设计图片写在前面
一直不太理解梯度下降算法是什么意思#xff0c;今天我们就解开它神秘的面纱 写在中间
线性回归方程 如果要求出一条直线#xff0c;我们只需知道直线上的两个不重合的点#xff0c;就可以通过解方程组来求出直线
但是#xff0c;如果我们选取的这两个点不在直…写在前面
一直不太理解梯度下降算法是什么意思今天我们就解开它神秘的面纱 写在中间
线性回归方程 如果要求出一条直线我们只需知道直线上的两个不重合的点就可以通过解方程组来求出直线
但是如果我们选取的这两个点不在直线上而是存在误差暂且称作观测误差这样求出的直线就会和原直线相差很大我们应该怎样做呢首先肯定不能只通过两个点就武断地求出这条直线。 我们通常尽可能多地使用分布在直线周围的点也可能不存在一条直线完美的穿过所有采样点。那么退而求其次我们希望能找到一条比较“好”的位于采样点中间的直线。那么怎么衡量“好”与“不好”呢一个很自然的想法就是求出当前模型的所有采样点上的预测值() 与真实值()之间的差的平方和作为总误差 L \mathcal{L} L然后搜索一组参数 w ∗ , b ∗ w^{*},b^{*} w∗,b∗使得 L \mathcal{L} L最小对应的直线就是我们要寻找的最优直线。 w ∗ , b ∗ arg min w , b 1 n ∑ i 1 n ( w x ( i ) b − y ( i ) ) 2 w^*,b^*\arg\min_{w,b}\frac{1}{n}\sum_{i1}^{n}\bigl(wx^{(i)}b-y^{(i)}\bigr)^2 w∗,b∗argminw,bn1∑i1n(wx(i)b−y(i))2 最后再通过梯度下降法来不断优化参数 w ∗ , b ∗ w^{*},b^{*} w∗,b∗
有基础的小伙伴们可能知道求误差的方法其实就是均方误差函数不懂得可以看这篇文章补充养分《误差函数》 我们这篇文章就侧重梯度下降。
梯度下降 函数的梯度定义为函数对各个自变量的偏导数组成的向量。不会的话翻翻高等数学下册书。
举个例子对于曲面函数 (, )函数对自变量的偏导数记为 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z函数对自变量的偏导数记为 ∂ z ∂ y \frac{\partial z}{\partial y} ∂y∂z则梯度∇为向量 ( ∂ z ∂ x , ∂ z ∂ y ) ({\frac{\partial z}{\partial x}},{\frac{\partial z}{\partial y}}) (∂x∂z,∂y∂z)梯度的方向总是指向当前位置函数值增速最大的方向函数曲面越陡峭梯度的模也越大。
函数在各处的梯度方向∇总是指向函数值增大的方向那么梯度的反方向−∇应指向函数值减少的方向。利用这一性质我们只需要按照下式来更新参数其中用来缩放梯度向量一般设置为某较小的值如 0.01、0.001 等。 x ′ x − η ⋅ d y d x xx-\eta\cdot\frac{\mathrm{d}y}{\mathrm{d}x} x′x−η⋅dxdy 结合上面的回归方程我们就可对误差函数求偏导以循环的方式更新参数 w , b w,b w,b w ′ w − η ∂ L ∂ w b ′ b − η ∂ L ∂ b \begin{aligned}ww-\eta\frac{\partial\mathcal{L}}{\partial w}\\\\bb-\eta\frac{\partial\mathcal{L}}{\partial b}\end{aligned} w′b′w−η∂w∂Lb−η∂b∂L 函数实现 计算过程都需要包裹在 with tf.GradientTape() as tape 上下文中使得前向计算时能够保存计算图信息方便自动求导操作。通过tape.gradient()函数求得网络参数到梯度信息结果保存在 grads 列表变量中。
GradientTape()函数
GradientTape(persistentFalse, watch_accessed_variablesTrue) persistent 布尔值用来指定新创建的gradient tape是否是可持续性的。默认是False意味着只能够调用一次GradientTape()函数再次使用会报错 watch_accessed_variables布尔值表明GradientTape()函数是否会自动追踪任何能被训练的变量。默认是True。要是为False的话意味着你需要手动去指定你想追踪的那些变量。
tape.watch()函数
tape.watch()用于跟踪指定类型的tensor变量。
由于GradientTape()默认只对tf.Variable类型的变量进行监控。如果需要监控的变量是tensor类型则需要tape.watch()来监控否则输出结果将是None
tape.gradient()函数
tape.gradient(target, source) target求导的因变量 source求导的自变量
import tensorflow as tfw tf.constant(1.)
x tf.constant(2.)
y x * wwith tf.GradientTape() as tape:tape.watch([w])y x * wgrads tape.gradient(y, [w])
print(grads)写在最后 点赞你的认可是我创作的动力 ⭐收藏你的青睐是我努力的方向 ✏️评论你的意见是我进步的财富