diff --git a/new/rl-tf/01.md b/new/rl-tf/01.md index ede1a30e3a595705cad6b1356f6a91f7c8b34cbd..c6cb96f8a1939b4a0e595f0cc323723153d1cd9f 100644 --- a/new/rl-tf/01.md +++ b/new/rl-tf/01.md @@ -274,19 +274,19 @@ ReLU 的导数图,对于`x <= 0`,`f'(x) = 1`,对于`x > 0`,`f'(x) = 0` # 梯度下降算法 -梯度下降算法是一种使用一阶导数查找函数最小值的优化算法,也就是说,我们仅将函数的参数区分为一阶。 在此,梯度下降算法的目的是使关于![](img/ed3142eb-4c35-49d1-9b1c-1564f27942bc.png)和![](img/d7942e82-2cc6-4f64-8b91-4a5e4e68eacd.png)的成本函数![](img/31fc771a-0a8b-4a2e-a93f-1549be49c2a5.png)最小化。 +梯度下降算法是一种使用一阶导数查找函数最小值的优化算法,也就是说,我们仅将函数的参数区分为一阶。 在此,梯度下降算法的目的是使关于`W`和`b`的成本函数`J(W, b)`最小化。 -此方法包括以下步骤,可进行多次迭代以最小化![](img/3e236823-8021-4b49-95e2-bf038fa95aed.png): +此方法包括以下步骤,可进行多次迭代以最小化`J(W, b)`: * ![](img/322d38ac-27f4-4518-8a17-f58b391472d5.png) * ![](img/fbdcd2fc-ce0e-4eb7-a681-cc83616c6af7.png) -上式中使用的![](img/9c671944-f1a5-423b-97ae-b2ad19d731ab.png)是指学习率。 学习速率是学习代理适应新知识的速度。 因此,![](img/0e4f3f5b-d48c-4b5f-b40d-b39341719c57.png),即学习率是需要作为标量值或时间函数分配的超参数。 这样,在每次迭代中,![](img/32cc518e-96eb-49e7-b8ab-67e304786888.png)和![](img/6d301bc6-c3b7-48ea-aceb-b440b8fb2bab.png)的值都按照上式进行更新,直到成本函数的值达到可接受的最小值为止。 +上式中使用的`α`是指学习率。 学习速率是学习代理适应新知识的速度。 因此,`α`,即学习率是需要作为标量值或时间函数分配的超参数。 这样,在每次迭代中,`W`和`b`的值都按照上式进行更新,直到成本函数的值达到可接受的最小值为止。 -梯度下降算法意味着沿斜率向下移动。 曲线的斜率由关于参数的成本函数![](img/c62e96a0-90a4-4788-863f-7a497ef31dde.png)表示。 斜率(即斜率)给出了正斜率(如果为正)和负斜率的方向。 因此,我们必须使用负号与斜率相乘,因为我们必须与增加斜率的方向相反并朝减小斜率的方向相反。 +梯度下降算法意味着沿斜率向下移动。 曲线的斜率由关于参数的成本函数`J`表示。 斜率(即斜率)给出了正斜率(如果为正)和负斜率的方向。 因此,我们必须使用负号与斜率相乘,因为我们必须与增加斜率的方向相反并朝减小斜率的方向相反。 -使用最佳学习率![](img/a5fe656b-1845-4fcd-b587-bbd3c845aa3a.png),可以控制下降,并且我们不会过度降低局部最小值。 如果学习率![](img/324f63e5-df40-435b-ae53-7c0bd35fc4e7.png)非常小,那么收敛将花费更多时间,而如果学习率![](img/324f63e5-df40-435b-ae53-7c0bd35fc4e7.png)非常高,则由于迭代次数众多,它可能会过冲并错过最小值和偏差: +使用最佳学习率`α`,可以控制下降,并且我们不会过度降低局部最小值。 如果学习率`α`非常小,那么收敛将花费更多时间,而如果学习率`α`非常高,则由于迭代次数众多,它可能会过冲并错过最小值和偏差: ![](img/6fb841aa-19f8-4076-8f53-668fdf30a60a.png) @@ -300,33 +300,35 @@ ReLU 的导数图,对于`x <= 0`,`f'(x) = 1`,对于`x > 0`,`f'(x) = 0` 计算的基本步骤是: -1. 计算![](img/dde4c2c4-319a-4425-9bb1-d0a30f7764e3.png) +1. 计算`Z^(i) = WX^(i) + b, ∀i` -2. 计算![](img/da78ad24-b624-4c93-831d-4796852e9dc9.png),预测输出 +2. 计算`y_hat^(i) = σ(Z^(i)), ∀i`,预测输出 -3. 计算成本函数:![](img/5f23715e-3539-463e-abfc-3c9c24407512.png) +3. 计算成本函数: + + ![](img/5f23715e-3539-463e-abfc-3c9c24407512.png) 假设我们有两个输入要素,即二维和`m`样本数据集。 因此,将是以下情况: -1. ![](img/a3b2061e-6ea5-4a0c-a42b-7459f547e217.png) +1. `X = {x[1], x[2]}` -2. 权重![](img/dfc88f50-722b-458d-9db8-4e894e85e6ca.png)和偏差![](img/f0900117-fa43-4e42-a457-7b8219ca7b1a.png) +2. 权重`W = {w[1], w[2]}`和偏差`b` -3. 因此,![](img/8e7eccd8-e9eb-4881-8d41-b106d02bfe97.png)和![](img/5badbe12-5cd4-4d93-952d-609604ceb96e.png) +3. 因此,`z^(i) = w[1]x[1]^(i) + w[2]x[2]^(i) + b`和`y_hat^(i) = σ(z^(i))` -4. 计算![](img/bb37b90d-4ad8-4c30-a724-77a4033f9a41.png)(所有示例的平均损失) +4. 计算`J(W, b)`(所有示例的平均损失) -5. 计算关于`W1`,`W2`和![](img/5a89f1ca-0ad9-4fc4-a33c-5e86cd20a19d.png)的导数,分别为![](img/37e34547-c0af-4612-8c4c-2620cd9967fe.png),![](img/7901b633-0cb8-4a60-b5ba-f8914d35f918.png)和![](img/b3bfea69-c05a-4bc2-8917-d55075b434d8.png)。 +5. 计算关于`w[1]`,`w[2]`和`b`的导数,分别为`∂J/∂w[1]`,`∂J/∂w[2]`和`∂J/∂b`。 -6. 按照前面的梯度下降部分所述修改![](img/01cbb122-5d17-40e4-a491-b31ffbdd923e.png)和![](img/5023e1b4-0ebe-4747-a107-9b24c242bbed.png) +6. 按照前面的梯度下降部分所述修改`w[1]`,`w[2]`和`b` 先前`m`个样本数据集的伪代码为: -1. 初始化学习率![](img/f655a9c1-3f79-4dfe-962c-dc4fb378b05d.png)和时期数`e`的值 +1. 初始化学习率`α`和时期数`e`的值 2. 循环遍历多个时期`e`'(每次完整的数据集将分批通过) 3. 将`J`(成本函数)和`b`(偏差)初始化为 0,对于`W1`和`W2`,您可以使用随机法线 或 **xavier 初始化**(在下一节中说明) -在此,a 是![](img/ceaa75dc-4585-4b36-a8c3-dd2b68020dda.png),`dw1`是![](img/ccc57303-c425-40a9-85af-ed1626be0b3a.png),`dw2`是![](img/c8121c4a-ce14-482f-9c4e-3293422533ea.png),`db`是![](img/4fa1d5c5-b308-49e6-8139-0aeee60ba588.png)。 每个迭代都包含一个循环遍历`m`个示例的循环。 +在此,`a`是`y_hat`,`dw1`是`∂J/∂w[1]`,`dw2`是`∂J/∂w[2]`,`db`是`∂J/∂b`。 每个迭代都包含一个循环遍历`m`个示例的循环。 这里给出了相同的伪代码: @@ -351,11 +353,11 @@ for j → 1 to e : # 什么是 Xavier 初始化? -Xavier 初始化是神经网络中权重的初始化,是遵循高斯分布的随机变量,其中方差![](img/73634749-294c-4aa7-8cc8-99fc9cbe8d2a.png)由 +Xavier 初始化是神经网络中权重的初始化,是遵循高斯分布的随机变量,其中方差`var(W)`由 ![](img/f0d757fd-0f14-45c1-bbe8-64d82825de3a.png) -其中,![](img/3d766227-5de7-4728-a458-569561e5626a.png)是当前层中的单元数,即传入的信号单元,![](img/915225f9-ecff-4106-8ee3-1c57e58c0f89.png)是下一层中的单元数,即传出的结果信号单元。 简而言之,![](img/d0542803-bc44-4acb-9336-6117ca9b5a75.png)是![](img/e7a5e994-9e7a-430c-90df-f9c83b99cae3.png)的形状。 +其中,`n_in`是当前层中的单元数,即传入的信号单元,`n_out`是下一层中的单元数,即传出的结果信号单元。 简而言之,`n_in * n_out`是`W`的形状。 # 为什么我们使用 xavier 初始化? @@ -385,7 +387,7 @@ Xavier 初始化是神经网络中权重的初始化,是遵循高斯分布的 * 对聚合信号进行激活以创建更深层的内部表示,这些表示又是相应隐藏节点的值 -参考上图,我们有三个输入功能![](img/08e07c6f-3487-48cf-9da0-ac1d5b589468.png)和![](img/45d82003-1dd4-4384-8964-96bab8e65d9c.png)。 显示值为 1 的节点被视为偏置单元。 除输出外,每一层通常都有一个偏置单元。 偏差单位可以看作是一个拦截项,在左右激活函数中起着重要作用。 请记住,隐藏层和其中的节点的数量是我们一开始定义的超参数。 在这里,我们将![](img/b27e3bd1-340c-4576-8805-b25a426e35b0.png)和![](img/dc417ad4-d548-4176-b05e-e4193e26620d.png)的隐藏层数定义为 1,将隐藏节点的数数定义为 3。 因此,可以说我们有三个输入单元,三个隐藏单元和三个输出单元(![](img/e0f0f3bb-5953-45d2-8a1a-cd0303871581.png)和![](img/7ccfb224-70cf-4cf8-b027-7d1eebdb7c8e.png),因为我们要预测的类别是三类)。 这将为我们提供与层关联的权重和偏差的形状。 例如,第 0 层具有 3 个单位,第 1 层具有 3 个单位。与第`i`层相关联的权重矩阵和偏差向量的形状如下: +参考上图,我们有三个输入功能`x[1], x[2], x[3]`。 显示值为 1 的节点被视为偏置单元。 除输出外,每一层通常都有一个偏置单元。 偏差单位可以看作是一个拦截项,在左右激活函数中起着重要作用。 请记住,隐藏层和其中的节点的数量是我们一开始定义的超参数。 在这里,我们将隐藏层数定义为 1,将隐藏节点的数数定义为 3,`a[1], a[2], a[3]`。 因此,可以说我们有三个输入单元,三个隐藏单元和三个输出单元(`h[1], h[2], h[3]`,因为我们要预测的类别是三类)。 这将为我们提供与层关联的权重和偏差的形状。 例如,第 0 层具有 3 个单位,第 1 层具有 3 个单位。与第`i`层相关联的权重矩阵和偏差向量的形状如下: ![](img/491169f7-46c4-469b-93cd-1cb8f4f01162.png) @@ -397,15 +399,15 @@ Xavier 初始化是神经网络中权重的初始化,是遵循高斯分布的 因此,形状如下: -* ![](img/643910b9-faf2-4b3d-94c8-78de55332589.png)将是![](img/0d15ae1d-38ef-46ea-8b44-99b15484ccef.png),![](img/651d43a9-e3e1-41bb-abfb-3ed94d0c2f25.png)将是![](img/36918b67-98db-4ceb-a2cd-6f3fb29a319b.png) +* `w[0, 1]`将是`3x3`,`b[0, 1]`将是`3` -* ![](img/520f2ea3-11c8-446f-ab1f-9f34dac875db.png)将是![](img/e4f8dae7-6e35-4ba0-b3da-b30dced8d3f3.png),![](img/8248caea-7531-4223-ac76-089fbabe1f2a.png)将是![](img/7bf0b148-274b-4a98-9e8c-6aa017330618.png) +* `w[1, 2]`将是`3x1`,`b[1, 2]`将是`1` 现在,让我们了解以下符号: -* ![](img/f132a689-d9e1-4520-92ec-02d904fa66f7.png):此处,是指将第`i`层中的节点`a`连接到第`i + 1`层中的节点`d`的权重值 +* `w[a(i)]^d(i+1)`:此处,是指将第`i`层中的节点`a`连接到第`i + 1`层中的节点`d`的权重值 -* ![](img/55e5bde4-f740-483e-be5c-ce23434dc99d.png):此处,它是指将第`i`层中的偏置单元节点连接到第`i + 1`层中的节点`d`的偏置值。 +* `b[i, i+1]^d`:此处,它是指将第`i`层中的偏置单元节点连接到第`i + 1`层中的节点`d`的偏置值。 因此,可以通过以下方式计算隐藏层中的节点: @@ -427,13 +429,13 @@ Xavier 初始化是神经网络中权重的初始化,是遵循高斯分布的 这使我们结束了正向传播过程。 我们的下一个任务是通过反向传播训练神经网络(即训练权重和偏差参数)。 -令实际输出类别为![](img/711b35c8-214e-4520-8f85-b799d4cb87cf.png)和![](img/494a3237-24ab-4544-b4e0-bf9403eeda93.png)。 +令实际输出类别为`y[1], y[2], y[3]`。 回顾线性回归中的成本函数部分,我们使用交叉熵来表示成本函数。 由于成本函数定义为 ![](img/fc10aaaf-bef5-473c-abaf-981aff989850.png) -其中,`C = 3`,![](img/505d1c06-5937-46cd-9ea7-621b755fd7ae.png)和`m`=示例数 +其中,`C = 3`,`y[c] = Y[c], y_hat[c] = h[c]`和`m`为示例数 由于这是一个分类问题,因此对于每个示例,输出将只有一个输出类别为 1,其余的将为零。 例如,对于`i`,它将是: