若需观看机器人系列相关博客,请劳驾至:【足式机器人无死角系列之-【强化学习基础-通用】、【仿真及训练环境】、【强化学习】:isaac-gym 与 isaac-lab 从零开始
郑重声明:该系列博客为本人 ( W e n h a i Z h u ) 独家私有 , 禁止转载与抄袭 , 首次举报有谢 , 若有需请私信授权! \color{red}郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权! 郑重声明:该系列博客为本人(WenhaiZhu)独家私有,禁止转载与抄袭,首次举报有谢,若有需请私信授权!
预告:该篇客将讲解目前最主流的算法 Deep Q-learning,其将深度神经网络整合到Q(动作价值)学习中,从而得到一种称为深度Q学习或深度Q网络(DQN)的方法。深度Q学习是最早且最成功的深度强化学习算法之一。本质上来说,其就是 Q-learning 通过 funcion approximation 实现的一种拓展方式,可是因为引入深度学习,具体实现存在很大差异。 |
本系列博客链接为: {\color{blue}本系列博客链接为:} 本系列博客链接为:【强化学习理论基础-通用】(01)从零开始白话给你讲,简单推导公式,深刻理解,一眼万年!:https://blog.youkuaiyun.com/weixin_43013761/article/details/143168169
本博客编写于: 20250127 ,台式机为 u b u n t u 20.04 , 3090 G e F o r c e R T X 显存 24 G { \color{purple} 本博客编写于:20250127,台式机为 ubuntu 20.04,3090 GeForce RTX 显存24G} 本博客编写于:20250127,台式机为ubuntu20.04,3090GeForceRTX显存24G:与你现在的代码,或者环境等存在一定差异也在情理之中,故切勿认为该系列博客绝对正确,且百密必有一疏,若发现错误处,恳请各位读者直接指出,本人会尽快进行整改,尽量使得后面的读者少踩坑,评论部分我会进行记录与感谢,只有这样,该系列博客才能成为精品,这里先拜谢各位朋友了。
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证,请备注 强化学习 。 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证,请备注\color{red} 强化学习}。 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证,请备注强化学习。
一、前言
前面的博客中,虽然多次提到神经网络,但是因为其较为复杂所以并没有进行深入的探讨。复杂的原因通常都是因为对参数
w
w
w 求导较为复杂,导致无法进行反向传播。比如说梯度下降系列博客 【强化学习理论基础-通用】(18)从零开始白话给你讲[数学原理]:随机梯度下降 SGD(Stochastic gradient descent) 数学推导 中推到出的(34)式:
g
~
(
w
k
,
η
k
)
=
∇
w
k
J
(
w
k
)
=
[
f
(
w
k
,
x
i
)
−
(
y
i
+
η
i
)
]
∗
∇
w
k
f
(
w
k
,
x
i
)
\color{green} \tag{01} \begin{align*} \tilde{g}\left(w_{k}, \eta_{k}\right)= \nabla_{w_k} J(w_{k})=&[f(w_k,x_i)-(y_i+\eta_i)]*\nabla_{w_k} f(w_k,x_i)\\ \end{align*}
g~(wk,ηk)=∇wkJ(wk)=[f(wk,xi)−(yi+ηi)]∗∇wkf(wk,xi)(01)可以知道构建好的目标函数梯度与神经网络
f
f
f 的具体实现有关,上一篇【强化学习理论基础-通用】(35)从零开始白话给你讲[数学原理]:值函数近似,Sarsa 与 Q-learning 使用 function approximation 其中关于 Q-learning 的迭代优化公式如下:
w
t
+
1
=
w
t
+
α
t
[
r
t
+
1
+
γ
max
a
∈
A
(
s
t
+
1
)
q
^
(
s
t
+
1
,
a
,
w
t
)
−
q
^
(
s
t
,
a
t
,
w
t
)
]
∇
w
q
^
(
s
t
,
a
t
,
w
t
)
(02)
\color{green} \tag{02} w_{t+1}=w_{t}+\alpha_{t}\left[r_{t+1}+\gamma {\color{blue} \max _{ a \in \mathcal{A}\left(s_{t+1}\right)}} \hat{q}\left(s_{t+1}, a, w_{t}\right)-\hat{q}\left(s_{t}, a_{t}, w_{t}\right)\right] \nabla_{w} \hat{q}\left(s_{t}, a_{t}, w_{t}\right)
wt+1=wt+αt[rt+1+γa∈A(st+1)maxq^(st+1,a,wt)−q^(st,at,wt)]∇wq^(st,at,wt)(02)为方便理解与示例,采用相对来说比较简单的 linear uncion approximation 形式来实现 Q-learning,即有:
q
^
(
s
,
a
,
w
)
=
ϕ
T
(
s
,
a
)
w
(03)
\color{green} \tag{03} \hat{q}(s, a, w)=\phi^{T}(s, a) w
q^(s,a,w)=ϕT(s,a)w(03)
ϕ
(
s
t
)
\phi\left(s_{t}\right)
ϕ(st) 为特征向量,采用5阶傅里叶函数。因为优化的参数为
w
w
w,所以把
ϕ
(
s
t
)
\phi\left(s_{t}\right)
ϕ(st) 看做常数即可,另外
w
w
w 又是线性。总的来说,
q
^
\hat{q}
q^ 对
w
w
w 求导是线性求导,十分简单。
该篇博客博客要讲解的 Deep Q-learning(DQN),该算法是虽然不是第一个把深度学习引入到强化学习之中的算法,但是却是最早较为成功的算法,虽然该算法之前已经有很多强化学习使用到神经网络,但是总的来说并不算很成功。
DQN 的成功主要归结于方法实现以及应用的成功,比如说对于游戏控制来说已经达到人类控制水平,且在方法实现上有比较大的创新,后续强化学习中这些创新技巧一直被延续使用。神经网络在 DQN 中承担一个非线性拟合的作用,与前面 linear uncion approximation 实现 Q-learning 最大的不同之处,就是上(13)式 q ^ \hat{q} q^ 使用神经网络来实现。
不过熟悉神经网络或者深度学习的朋友应该知道,现在工具包比如 pyotrch,tensorflow 等都比较成熟,对于使用者来说基本都是调用接口接口,比如说实现一个简单的神经网络,基本上构建好网络结构之后,就是定义好目标函数,再通过训练数据进行反向传播优化参数即可。
也就是说,使用这些深度学习工具可以极大提高神经网络实现且进行训练的效率,没有必要使用(02)式这种底层的方式,自己去求解梯度 ∇ w q ^ ( s t , a t , w t ) \nabla_{w} \hat{q}\left(s_{t}, a_{t}, w_{t}\right) ∇wq^(st,at,wt),然后再实现参数的更新等。起都可以通过调用深度学习框架 API 接口完成,亦或者说这些工作可以交给深度学习框架,他们很擅长处理这些问题。
二、目标函数
前面进行那么多的铺垫,都是为了更好的分析与讲解 Deep Q-learning(DQN),参考前面的博客 【强化学习理论基础-通用】(19)从零开始白话给你讲[数学原理]:随机梯度下降系列:BGD、MBGD 数学推导(SGD推广),可以知道构建好的神经网络其中一个核心要点就是定义适当的目标(损失)函数,Deep Q-learning(DQN) 与 Q-learning 的目标函数是一致的:
J
(
w
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
−
q
^
(
S
,
A
,
w
)
)
2
]
(04)
\color{red} \tag{04}J(w)=\mathbb{E}\left[(R+\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)-\hat{q}(S, A, w))^{2}\right]
J(w)=E[(R+γa∈A(S′)maxq^(S′,a,w)−q^(S,A,w))2](04)为何这样定义可以回顾一下前面的博客:【强化学习理论基础-通用】(29)从零开始白话给你讲[数学原理]:时序差分(Temporal-Difference),回顾与总结,TD算法统一形式 可知一系列 TD 算法统一形式为:
q
t
+
1
(
s
t
,
a
t
)
=
q
t
(
s
t
,
a
t
)
−
α
t
(
s
t
,
a
t
)
[
q
t
(
s
t
,
a
t
)
−
q
ˉ
t
]
(05)
\color{blue} \tag{05} q_{t+1}\left(s_{t}, a_{t}\right)=q_{t}\left(s_{t}, a_{t}\right)-\alpha_{t}\left(s_{t}, a_{t}\right)\left[q_{t}\left(s_{t}, a_{t}\right)-{\color{red} \bar{q}_{t}}\right]
qt+1(st,at)=qt(st,at)−αt(st,at)[qt(st,at)−qˉt](05)其中
q
ˉ
t
\color{red} \bar{q}_{t}
qˉt 就是迭代优化过程中的目标,该值越稳定,那么收敛过程就越稳定,该值波动越大,则收敛过程波动越大。TD-SV、Sarsa、Expected Sarsa、 n-step Sarsa 以及 Q-learning 算法关于
q
ˉ
t
\color{black} \bar{q}_{t}
qˉt 的定义式不一样的,Q-learning 的优化目标
q
ˉ
t
\color{black} \bar{q}_{t}
qˉt 定义如下:
q
ˉ
t
=
r
t
+
1
+
γ
max
a
q
t
(
s
t
+
1
,
a
)
(06)
\color{green} \tag{06} \bar{q}_{t}=r_{t+1}+\gamma \max _{a} q_{t}\left(s_{t+1}, a\right)
qˉt=rt+1+γamaxqt(st+1,a)(06) 把上式带入到(05)式,容易知道迭代优化目的就是希望
q
t
(
s
t
,
a
t
)
q_{t}\left(s_{t}, a_{t}\right)
qt(st,at) 逼近
q
ˉ
t
\color{black} \bar{q}_{t}
qˉt,记误差为:
e
r
r
o
r
=
r
t
+
1
+
γ
max
a
q
t
(
s
t
+
1
,
a
)
−
q
t
(
s
t
,
a
t
)
(07)
\color{green} \tag{07} error=r_{t+1}+\gamma \max _{a} q_{t}\left(s_{t+1}, a\right)- q_{t}\left(s_{t}, a_{t}\right)
error=rt+1+γamaxqt(st+1,a)−qt(st,at)(07) 上式中使用的都是小写,表示实际采样,可把部分替换成随机变量形:
e
r
r
o
r
=
R
t
+
1
+
γ
max
a
q
t
(
S
t
+
1
,
a
)
−
q
t
(
S
t
,
A
t
)
]
(08)
\color{green} \tag{08}error=R_{t+1}+\gamma \max _{a} q_{t}\left(S_{t+1}, a\right)- q_{t}\left(S_{t}, A_{t}\right)]
error=Rt+1+γamaxqt(St+1,a)−qt(St,At)](08)再把上式中的符号调整一下,
S
t
,
A
t
S_t,A_t
St,At 记为
S
,
A
S,A
S,A;
S
t
+
1
S_{t+1}
St+1 记为
S
′
S'
S′;按理来说
R
t
+
1
R_{t+1}
Rt+1 应该记为
R
′
R'
R′,不过记为
R
R
R,当然也是没有关系,只要记住其是切入
S
t
+
1
S_{t+1}
St+1 状态时对应的及时奖励即可;最后再引入参数
w
w
w,使用
q
^
\hat{q}
q^ 代替
q
q
q 表动作价值的估计; 那么上式可得:
e
r
r
o
r
=
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
−
q
^
(
S
,
A
,
w
)
(09)
\color{green} \tag{09} error=R+\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)-\hat{q}(S, A, w)
error=R+γa∈A(S′)maxq^(S′,a,w)−q^(S,A,w)(09)上式为带随机变量的误差形式,进一步可构建如(04)式所示的优化目标形式。既然知道目标函数的来龙去脉,下一步就是分析如何使得该目标函数最小化。
三、思维引导
为使得目标函数
J
(
w
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
−
q
^
(
S
,
A
,
w
)
)
2
]
J(w)=\mathbb{E}\left[(R+\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)-\hat{q}(S, A, w))^{2}\right]
J(w)=E[(R+γmaxa∈A(S′)q^(S′,a,w)−q^(S,A,w))2] 最小化?应该采取什么方案呢?熟悉的朋友第一时间想到的应该是梯度下降,本人也是,所谓英雄所见略同。使用梯度下降算法理算当然要求得目标函数的的梯度,即求得:
J
(
w
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
⏟
第一项
−
q
^
(
S
,
A
,
w
)
⏟
第二项
)
2
]
(10)
\color{red} \tag{10}J(w)=\mathbb{E}\left[(R+{\color{blue} \underbrace{\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)}_{第一项}}-{\color{blue}\underbrace{ \hat{q}(S, A, w)}_{第二项}})^{2}\right]
J(w)=E
(R+第一项
γa∈A(S′)maxq^(S′,a,w)−第二项
q^(S,A,w))2
(10)相对于参数
w
w
w 的梯度,从上式易看出与
w
w
w 相关部分可以划分为
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)
γmaxa∈A(S′)q^(S′,a,w) 与
q
^
(
S
,
A
,
w
)
\hat{q}(S, A, w)
q^(S,A,w) 这两项。后者第二项其相对于
w
w
w 的梯度通常来说是比较简单的,调用深度学习框架工具很容易求解,但是前者:
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
)
(11)
\color{green} \tag{11}\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right)
γa∈A(S′)maxq^(S′,a,w)(11)其相对于
w
w
w 的梯度若直接求解,相对来说比较复杂,因存在循环遍历。Deep Q-learning(DQN) 采取一个十分高超的技巧求解:
技巧: 熟悉偏导的朋友应该知道,若设函数 y=f(x1,x2),当求解 y 相对于 x1 的偏导时,会把 x2 看做常数,相应的,如实求解 y 相对于 x2 的偏导时,会把 x1 看做常数。类似于这种方式,DQN 把(10) 式中与 w 相关部分划分成第一项与第二项。 |
虽然大致解说了一下思路,但是具体应该如何实现呢?要知道第一项与第二项都含有 w w w,不是说看成常数就直接可以看做常数的,直白说,第一项与第二项中都包含 q ^ \color{red} \hat q q^,其是关于权重参数 w w w 的神经网络,为后续方便这里先记第一项: y = γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , w ) (12) \color{green} \tag{12}y=\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w\right) y=γa∈A(S′)maxq^(S′,a,w)(12)此时很明显存在的一个问题是,若是把第一项 y y y 这整体看做是一个常数,通过反向传播对第二项 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 中的权重参数 w w w 进行更新时,第一项 y y y 中的权重参数 w w w 也会更新。这样就没有办法把 y y y 作为常数来对待。总的来说,核心矛盾点就是第一项 q ^ ( S ′ , a , w ) \hat{q}\left(S^{\prime}, a, w\right) q^(S′,a,w) 与第二项 q ^ ( S , A , w ) \hat{q}(S, A, w) q^(S,A,w) 共用权重参数 w w w,无法单独更新。
为调和上诉矛盾,DQN 使用两个神经网络
q
^
\hat q
q^ 来进行动作价值评估,除了权重参数不一致,其余基本相同(如网络结构),两个网络的权重参数分别对应
w
T
w_T
wT、
w
w
w。这样从根本上把(10)式的第一项与第二项隔离开来,对第一项神经网络
q
^
\hat q
q^ 权重参数
w
T
w_T
wT 进行更新不会影响到第二项神经网络
q
^
\hat q
q^ 的权重参数
w
w
w,可把(10)式改写如下:
J
(
w
)
=
E
[
(
R
+
γ
max
a
∈
A
(
S
′
)
q
^
(
S
′
,
a
,
w
T
)
⏟
第一项
−
q
^
(
S
,
A
,
w
)
⏟
第二项
)
2
]
(13)
\color{green} \tag{13}J(w)=\mathbb{E}\left[(R+{\color{blue} \underbrace{\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} {\color{red}{\hat{q}}}\left(S^{\prime}, a, {\color{red}w_T}\right)}_{第一项}}-{\color{blue}\underbrace{ {\color{red} \hat{q}}(S, A, {\color{red}w})}_{第二项}})^{2}\right]
J(w)=E
(R+第一项
γa∈A(S′)maxq^(S′,a,wT)−第二项
q^(S,A,w))2
(13)
有的朋友可能觉得更加复杂,虽然两个神经网络的权重参数在更新貌似没有任何关联了,但是具体编程应该如何实现呢?两个神经网络的权重参数
w
T
w_T
wT、
w
2
w_2
w2 如何通过反向传播进行更新呢?不用着急,在后续详细分析分析过程中可以发现并没有想象的那么复杂。
四、逻辑思想
通过上面(06)式 r t + 1 + γ max a q t ( s t + 1 , a ) r_{t+1}+\gamma \max _{a} q_{t}\left(s_{t+1}, a\right) rt+1+γmaxaqt(st+1,a) 以及对 Q-learning 分析,可以知道上(13)式中如下部分: Target = R + γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) (14) \color{green} \tag{14} \text{Target} = R+ \gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} {\color{green}{\hat{q}}}\left(S^{\prime}, a, {\color{green}w_T}\right) Target=R+γa∈A(S′)maxq^(S′,a,wT)(14)优化过程中的目标,只不过是随机变量形式而已,神经网络 q ^ \hat q q^ 的权重参数记为 w T w_T wT, T T T 就表示 Taget(目标) 的意思。熟悉随机梯度下降的朋友应该知道,因为学习率以及梯度大小的限制,通常是无法通过一次对权重参数 w w w 优化或者迭代直接达到最优目标 Taget。那么在优化第二神经网络: q ^ ( S , A , w ) (15) \color{green} \tag{15} \color{green} \hat{q}(S, A, {\color{red}w}) q^(S,A,w)(15) 的权重参数 w w w 时,完全可以把(13)式的第一项当做常数来对待,因为现在权重参数 w T w_T wT 与 w w w 之间是是没有任何联系或干扰。 有的朋友可能已经看出,通过这种方式 对 w w w 权重进行多次的迭代更新,会使得第二神经网络-上(15)的结果接近于目标(14)式。
理解上述思想之后,再来看看具体实现细节是如何的:
( 步骤 1 ) \color{blue}(步骤1) (步骤1) 首先初始化一个神经网络 q ^ ( w ) \hat q(w) q^(w) 用来估算动作价值,其 w w w 表示该神经网络的权重参数。接着再初始一个相同网络 q ^ ( w T ) \hat q(w_T) q^(wT)。
( 步骤 2 ) \color{blue}(步骤2) (步骤2) 复制权重参数 w w w 给到 w T w_T wT,此时 q ^ ( w ) \hat q(w) q^(w) 与 q ^ ( w T ) \hat q(w_T) q^(wT) 虽然是两个神经网络,但是因为网络结构与权重参数一致,对于同一状态下同一动作价值评估是一致的。
( 步骤 3 ) \color{blue}(步骤3) (步骤3) 先把 w T w_T wT 看做常数,即只考虑神经网络 q ^ ( w ) \hat q(w) q^(w) 的权重优化,若现在权重参数是完美的,那么目标函数(03)式的结果为 0 0 0,若不为 0 0 0,则对神经网络 q ^ ( w ) \hat q(w) q^(w) 的权重参数 w w w 进行优化。
( 步骤 4 ) \color{blue}(步骤4) (步骤4) 重复多次步骤3,误差(损失)会逐渐减少,当降低到某个阈值或者说优化一定次数之后,再到步骤2,执行一次复制权重参数 w w w 给到 w T w_T wT 的操作,再重复多次步骤3,这样一直循环下去。
总的来说,还是挺好理解的,就是有两个神经网络,为构建完美的动作价值评估网络,为尽量满足: R + γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) − q ^ ( S , A , w ) = 0 (16) \color{green} \tag{16} R+{\color{green} \gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} {\color{red}{\hat{q}}}\left(S^{\prime}, a, {\color{red}w_T}\right)}-\hat{q}(S, A, {\color{red}w})=0 R+γa∈A(S′)maxq^(S′,a,wT)−q^(S,A,w)=0(16) 优化过程会以一定频率,拷贝神经网络 q ^ ( w ) \hat q(w) q^(w) 权重给到 q ^ ( w T ) \hat q(w_T) q^(wT) 且固定权重 w T w_T wT 不进行反向传播。但是 w w w 会通过反向传播优化。需要注意上式中 S , A S,A S,A 表示当前时刻动状态与动作的随机变量, S ′ , A ′ S',A' S′,A′ 表示当前时刻动状态与动作的随机变量,若神经网络 q ^ \hat q q^ 是完美的,根据基于动作价值的贝尔曼公式可得: q ^ ( S , A , w ) = R + γ q ^ ( S ′ , A ′ , w ) (17) \color{green} \tag{17} \hat q(S,A,w)=R+ \gamma \hat q(S',A',w) q^(S,A,w)=R+γq^(S′,A′,w)(17)可与(16)式进行参照对比,前面已经多次提到(15)式只是(17)式再数据有限情况下,依旧想进行优化的一个特殊版本而已。另外需要提及一下,优化到最后 q ^ ( w ) \hat q(w) q^(w) 为主要动作价值估算网络,优化的是他,后续若需进行实际部署,那么也是选择他。
五、总结
前面虽然介绍了很多,但是依旧没有给出目标函数(04)式的梯度形式,不过通过前面的讨论可把第一项看做常数项来对待,那么易得: ∇ w J = − E [ ( R + γ max a ∈ A ( S ′ ) q ^ ( S ′ , a , w T ) − q ^ ( S , A , w ) ) ∇ w q ^ ( S , A , w ) ] (18) \color{green} \tag{18} \nabla_{w} J=-\mathbb{E}\left[\left(R+{\color{blue}\gamma \max _{a \in \mathcal{A}\left(S^{\prime}\right)} \hat{q}\left(S^{\prime}, a, w_{T}\right)}-\hat{q}(S, A, w)\right) \nabla_{w} \hat{q}(S, A, w)\right] ∇wJ=−E[(R+γa∈A(S′)maxq^(S′,a,wT)−q^(S,A,w))∇wq^(S,A,w)](18)蓝色部分迭代优化过程中,相对于权重参数 w w w 来说是常数项。具体推到过程这里就不再进行重复了,因为该过程还是比较简单。若是忘记相关知识点的朋友可以翻阅一下前面的博客。
现已求得梯度,剩下的工作就是通过 RM 或者反向传播对权重参数 w w w 进行优化,若想深入了解细节过程可参考博客:【强化学习理论基础-通用】(17)从零开始白话给你讲[数学原理]:随机近似(Stochastic Approximation),罗宾逊-蒙罗算法(Robbins-Monro algorithm)。不过通常来说,在使用深度学习框架 API 的情况下,比如通过 Pytorch 或者 TensorFlow 接口,直接构建目标函数即可进行反向传播实现参数优化,上面(18)式求解目标函梯度的过程都可省略。