提交 4ae255bb 编写于 作者: W wizardforcel

2020-12-25 18:02:07

上级 d9dacbb7
......@@ -40,7 +40,7 @@
# 基于潜在分解的推荐系统
基于潜在因子分解的过滤器推荐方法尝试通过分解评分来发现潜在特征,以表示用户和项目资料。 与基于内容的过滤功能不同,这些潜在功能不可解释,可以表示复杂的功能。 例如,在电影推荐系统中,潜在特征之一可能以特定比例表示幽默,悬念和浪漫的线性组合。 通常,对于已经评分的商品,用户`i`对商品`j`的评分`r[ij]`可以表示为![](img/08ca7c40-3d15-4f76-9361-0ecf5097bba3.png)。 其中`u[i]`是基于潜在因子的用户配置文件矢量,而`v[i]`是基于相同潜在因子的项目矢量 :
基于潜在因子分解的过滤器推荐方法尝试通过分解评分来发现潜在特征,以表示用户和项目资料。 与基于内容的过滤功能不同,这些潜在功能不可解释,可以表示复杂的功能。 例如,在电影推荐系统中,潜在特征之一可能以特定比例表示幽默,悬念和浪漫的线性组合。 通常,对于已经评分的商品,用户`i`对商品`j`的评分`r[ij]`可以表示为`r[ij] = u[i]^T v[j]`。 其中`u[i]`是基于潜在因子的用户配置文件矢量,而`v[i]`是基于相同潜在因子的项目矢量 :
![](img/719736b5-d23e-49ca-b6b2-bfcda9d9657a.png)
......@@ -216,7 +216,7 @@ test_ratings_df[test_ratings_df['userID'] == 1].sort_values(['rating','predictio
通常,SVD 不会捕获用户和数据中可能存在的项目偏差。 一种名为 SVD++ 的方法考虑了潜在分解因子方法中的用户和项目偏见,并且在诸如 *Netflix Challenge* 之类的比赛中非常流行。
进行基于潜在因素推荐的最常见方法是将用户配置文件定义为`u[i] ∈ R^k``b[i] ∈ R`,项目轮廓和偏差为`v[i] ∈ R^k``b[j] ∈ R`。 然后,将用户`i`对项目`j`提供的评分![](img/0cdbff49-855e-4e8b-83d9-9e15fd915288.png)定义如下:
进行基于潜在因素推荐的最常见方法是将用户配置文件定义为`u[i] ∈ R^k``b[i] ∈ R`,项目轮廓和偏差为`v[i] ∈ R^k``b[j] ∈ R`。 然后,将用户`i`对项目`j`提供的评分`r_hat[ij]`定义如下:
![](img/2b104cdf-38fe-4cd4-88eb-dfbebd434b43.png)
......@@ -313,21 +313,21 @@ RMSE: 0.9320
隐藏层激活有望对输入信号进行编码并重新创建。 受限制的玻尔兹曼机通常可处理二进制数据:
<sup>![](img/f17a6b6e-bf3f-4fd9-a849-0d012a9af206.png)</sup>
![](img/f17a6b6e-bf3f-4fd9-a849-0d012a9af206.png)
图 6.6:用于二进制数据的受限玻尔兹曼机
只是为了刷新我们的记忆,上图(“图 6.6”)是一个 RBM,具有`m`输入或可见单位。 这被投影到具有`n`个单位的隐藏层。 给定可见层输入[H​​TG6],则隐藏单元彼此独立,因此可以如下进行采样,其中![](img/71f41038-5216-48cd-9474-3d36fd1c8758.png)表示 Sigmoid 函数:
只是为了刷新我们的记忆,上图(“图 6.6”)是一个 RBM,具有`m`输入或可见单位。 这被投影到具有`n`个单位的隐藏层。 给定可见层输入`v[i]`,则隐藏单元彼此独立,因此可以如下进行采样,其中`σ(·)`表示 Sigmoid 函数:
![](img/e4c4d443-0ad5-4a56-a6ac-73c05bcca858.png)
类似地,给定隐藏层激活![](img/3353a514-2aab-4315-b1c9-9657d1980099.png),可见层单元是独立的,可以如下进行采样:
类似地,给定隐藏层激活`h = {h[j]}, j = 1 -> n`,可见层单元是独立的,可以如下进行采样:
![](img/8b9a6a5c-dafb-4b91-b89d-676a37ce40ce.png)
RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`w[ij] ∈ w[mxn]`,在可见单位`i`处的偏差`c[i] ∈ b`和隐藏层单位`j`处的偏差`c[j] ∈ c`
通过最大化可见输入数据的可能性来学习 RBM 的这些参数。 如果我们用![](img/6e1f5d8d-3ab5-4e9f-b655-406ea08c4f5d.png)表示组合的参数集,并且有一组`T`训练输入数据点,则在 RBM 中,我们尝试使似然函数最大化:
通过最大化可见输入数据的可能性来学习 RBM 的这些参数。 如果我们用`θ = [W; b; c]`表示组合的参数集,并且有一组`T`训练输入数据点,则在 RBM 中,我们尝试使似然函数最大化:
![](img/6498b6ad-daea-4a98-a082-ff764b9de960.png)
......@@ -343,17 +343,17 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`
![](img/2f08b2c0-b2cf-4e04-abda-de583497996c.png)
术语![](img/cc978ebd-0c2f-4826-9077-62919760b470.png)表示对隐藏和可见单位的联合概率分布的任何给定数量的期望。 另外,![](img/22e2a62c-c438-4531-b536-8ef4b47a74f7.png)表示给定可见单位`v`的采样的隐藏层输出。 在梯度下降的每次迭代中计算联合概率分布的期望在计算上是棘手的。 我们将采用下一节中讨论的称为**对比发散**的智能方法来计算期望值。
术语`E[.]`表示对隐藏和可见单位的联合概率分布的任何给定数量的期望。 另外,`h_hat`表示给定可见单位`v`的采样的隐藏层输出。 在梯度下降的每次迭代中计算联合概率分布的期望在计算上是棘手的。 我们将采用下一节中讨论的称为**对比发散**的智能方法来计算期望值。
# 对比分歧
计算联合概率分布的期望值的一种方法是通过吉布斯采样从联合概率分布中生成很多样本,然后将样本的平均值作为期望值。 在吉布斯抽样中,可以以其余变量为条件对联合概率分布中的每个变量进行抽样。 由于可见单位是独立的,因此给定隐藏单位,反之亦然,因此您可以将隐藏单位采样为![](img/86849800-744f-4771-96a1-94246e7b9332.png),然后将可见单位激活给定隐藏单位为![](img/0738e0a3-6a59-46f7-96a1-dea1b0bc29f8.png)。 然后我们可以将样本![](img/c9b254f1-f757-4479-8744-0fed6b0d930d.png)作为从联合概率分布中抽取的样本。 这样,我们可以生成大量样本,例如`M`,并取其平均值来计算期望的期望值。 但是,在梯度下降的每个步骤中进行如此大量的采样将使训练过程变得令人无法接受的缓慢,因此,与其在梯度下降的每个步骤中计算许多样本的平均值,不如从联合概率中生成一个样本 表示整个联合概率分布中期望期望的分布:
计算联合概率分布的期望值的一种方法是通过吉布斯采样从联合概率分布中生成很多样本,然后将样本的平均值作为期望值。 在吉布斯抽样中,可以以其余变量为条件对联合概率分布中的每个变量进行抽样。 由于可见单位是独立的,因此给定隐藏单位,反之亦然,因此您可以将隐藏单位采样为`h_bar <- P(h/v)`,然后将可见单位激活给定隐藏单位为`v_bar = P(v/h = h_bar)`。 然后我们可以将样本`(v_bar, h_bar)`作为从联合概率分布中抽取的样本。 这样,我们可以生成大量样本,例如`M`,并取其平均值来计算期望的期望值。 但是,在梯度下降的每个步骤中进行如此大量的采样将使训练过程变得令人无法接受的缓慢,因此,与其在梯度下降的每个步骤中计算许多样本的平均值,不如从联合概率中生成一个样本 表示整个联合概率分布中期望期望的分布:
![](img/e1fb8a28-45d4-4ebd-b17c-861618cfd639.png)
图 6.7:对比散度图
如上图所示(“图 6.7”),我们从可见的输入`v^(t)`开始,并对隐藏层进行采样 根据条件概率分布`P(h / v = v^(t))`激活![](img/f6ddc0c8-b917-44aa-a6c8-dadd737358ab.png)。 再次,使用条件概率分布`P(v / h = h')`,我们对`v'`进行采样。 根据条件概率分布`P(h / v = v')`对隐藏单元的下一次采样给出![](img/2f29e0d4-e0c2-4c48-aa9f-9f3b52890d1b.png),然后使用![](img/af67a34a-3350-44c1-b5f8-9bb47f2c265a.png)对可见单元激活进行采样 给我们![](img/71ba3b2e-6fa9-482f-b01d-a3bd8bdac420.png)。 对于`v``h`,即![](img/a13d0854-7fa0-4a6f-a01b-d277a377c7eb.png)的整个联合概率分布,将样本![](img/bbe647d9-d45c-448f-8169-04ef6cc6a007.png)取为代表性样本。 相同的用于计算包含`v``h`的任何表达式的期望。 这种采样过程称为对比散度。
如上图所示(“图 6.7”),我们从可见的输入`v^(t)`开始,并对隐藏层进行采样 根据条件概率分布`P(h / v = v^(t))`激活`h'`。 再次,使用条件概率分布`P(v / h = h')`,我们对`v'`进行采样。 根据条件概率分布`P(h / v = v')`对隐藏单元的下一次采样给出`h_bar`,然后使用`P(v/h = h_bar)`对可见单元激活进行采样 给我们`v_bar`。 对于`v``h`,即`P(v, h/Θ)`的整个联合概率分布,将样本`(v_bar, h_bar)`取为代表性样本。 相同的用于计算包含`v``h`的任何表达式的期望。 这种采样过程称为对比散度。
从可见输入开始,然后从条件分布`P(v / h)``P(v / h)`连续采样构成吉布斯采样的一个步骤,并为我们提供了一个样本 联合分布中的`v / h`。 代替在吉布斯采样的每个步骤中选择样本`v / h`,我们可以选择从条件概率分布中进行几次连续的采样迭代后再选择样本。 如果在吉布斯采样的`k`个步骤之后,选择了代表元素,则将对比散度称为`CD-k`。 “图 6.7”中所示的对比散度可以称为`CD-2`,因为我们是在经过两步吉布斯采样后才选择样本的。
......@@ -381,7 +381,7 @@ RBM 的参数是可见层单位`i`与隐藏层单位之间的广义权重连接`
此处,`m = M * k`
与传统的 RBM 不同,在给定隐藏层激活的情况下,无法独立采样该网络可见层中的二进制单元。 相对于电影的评分,每个`k`个二进制单位通过 k 路 softmax 激活函数进行绑定。 如果给定隐藏单元的特定电影的可见单元的输入为![](img/ea7938ea-796c-4ab5-af23-84d6aae4513a.png),则电影`i`的评分`l`的一般输入计算如下:
与传统的 RBM 不同,在给定隐藏层激活的情况下,无法独立采样该网络可见层中的二进制单元。 相对于电影的评分,每个`k`个二进制单位通过 k 路 softmax 激活函数进行绑定。 如果给定隐藏单元的特定电影的可见单元的输入为`s[i1], s[i2], ..., s[il], ..., s[ik]`,则电影`i`的评分`l`的一般输入计算如下:
![](img/ebac218a-2831-48b7-ad7b-c718d8fcc48e.png)
......
......@@ -57,9 +57,9 @@
图 8.2:使用 LSTM 的序列到序列模型
从上图(“图 8.2”)中可以看出,**编码器 LSTM** 接受单词的输入序列,并将其编码为隐藏状态向量![](img/d6601a00-aee8-4b56-9f4f-a1d74a31845c.png)和单元状态 向量![](img/6d00aab9-ba58-44cc-8d6f-dffeffeb21d3.png)。 向量![](img/5efc3fa3-dba4-408d-9c1b-a5fe3bf7e9a3.png)和![](img/6dba45e9-875c-4637-9653-dd2925f0b69d.png)是 LSTM 编码器最后一步的隐藏状态和单元状态。 它们本质上将捕获整个输入句子的上下文。
从上图(“图 8.2”)中可以看出,**编码器 LSTM** 接受单词的输入序列,并将其编码为隐藏状态向量`h`和单元状态 向量`c`。 向量`h``c`是 LSTM 编码器最后一步的隐藏状态和单元状态。 它们本质上将捕获整个输入句子的上下文。
然后,以![](img/35169e57-0797-4240-b4ce-2b9187aadfde.png)和![](img/2e6449ad-2e66-47ee-9242-c23ffda15fbb.png)形式的编码信息作为其初始隐藏状态和单元状态被馈送到**解码器 LSTM** 。 每个步骤中的**解码器 LSTM** 尝试预测以当前单词为条件的下一个单词。 这意味着,**解码器 LSTM** 的每个步骤的输入都是当前字。
然后,以`h``c`形式的编码信息作为其初始隐藏状态和单元状态被馈送到**解码器 LSTM** 。 每个步骤中的**解码器 LSTM** 尝试预测以当前单词为条件的下一个单词。 这意味着,**解码器 LSTM** 的每个步骤的输入都是当前字。
为了预测第一个单词,LSTM 将提供一个虚拟的起始关键字`<BOS>`,它代表句子的开头。 同样, `<EOS>`虚拟关键字表示句子的结尾,并且一旦预测到该句,就应该停止输出生成。
......@@ -73,7 +73,7 @@
图 8.3:序列到序列模型
与其将编码器最后一步的隐藏状态![](img/b280832c-087e-4ce5-99f0-9a205e376734.png)和单元状态![](img/4347c730-0027-498b-861c-83a9b8964b97.png)馈送到**解码器 LSTM** 的初始隐藏状态和单元状态,我们将隐藏状态![](img/6ab55e2d-1eb0-4ee6-a521-7bc8647608fc.png)馈入 解码器的每个输入步骤。 为了预测目标词`w[t]`在任何步骤`t`中,输入是先前的目标词`w[t-1]``t-1`和隐藏状态![](img/7468f056-f04e-453b-b511-e68a97fa151e.png)
与其将编码器最后一步的隐藏状态`h`和单元状态`c`馈送到**解码器 LSTM** 的初始隐藏状态和单元状态,我们将隐藏状态`h`馈入 解码器的每个输入步骤。 为了预测目标词`w[t]`在任何步骤`t`中,输入是先前的目标词`w[t-1]``t-1`和隐藏状态`h`
# Twitter 上的客户支持
......@@ -171,9 +171,9 @@ def words_to_indices(self,sent):
RNN 的 LSTM 版本用于构建序列到序列模型。 这是因为 LSTM 在记住长文本序列中的长期依存关系方面效率更高。 LSTM 架构中的三个门使它能够有效地记住长期序列。 基本的 RNN 无法记住长期依赖关系,因为与其架构相关的梯度问题逐渐消失。
在此模型中,我们使用两个 LSTM。 第一个 LSTM 将输入推文编码为上下文向量。 该上下文向量不过是编码器 LSTM 的最后一个隐藏状态![](img/88e131cf-cc81-4f08-bb73-0bbb27ce18ed.png)`n`是隐藏状态向量的维。 输入推文![](img/ee42536a-7091-4d15-8ec9-ef97ead2b272.png)作为单词索引序列被馈送到编码器 LSTM,`k`就是输入推文的序列长度。 这些单词索引在馈送到 LSTM 之前已映射到单词嵌入`w ∈ R^m`。 单词嵌入包含在一个嵌入矩阵中`[W ∈ R^(m x N)]`,其中`N`表示词汇表中单词的数量。
在此模型中,我们使用两个 LSTM。 第一个 LSTM 将输入推文编码为上下文向量。 该上下文向量不过是编码器 LSTM 的最后一个隐藏状态`h ∈ R^n``n`是隐藏状态向量的维。 输入推文`x ∈ R^k`作为单词索引序列被馈送到编码器 LSTM,`k`就是输入推文的序列长度。 这些单词索引在馈送到 LSTM 之前已映射到单词嵌入`w ∈ R^m`。 单词嵌入包含在一个嵌入矩阵中`[W ∈ R^(m x N)]`,其中`N`表示词汇表中单词的数量。
第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量![](img/4c8e1ab3-3b4e-4061-b674-5cbd46748052.png)解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推理过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推理期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态![](img/99084dfb-e5ab-4074-ad44-01bb8d36b1d3.png)在最终的最大 softmax `N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`
第二个 LSTM 用作解码器。 它试图将编码器 LSTM 创建的上下文向量`h`解码为有意义的响应。 作为此方法的一部分,我们在每个时间步中将上下文向量与前一个单词一起馈入以生成当前单词。 在第一步中,我们没有任何先前的词可用于条件 LSTM,因此我们使用代理`START`词开始从解码器 LSTM 生成词序列的过程。 在推理过程中,我们在当前时间步输入前一个单词的方式与训练过程中使用的方法不同。 在训练中,由于我们在每个时间步都知道`apriori`之前的单词,因此相应地输入它们没有任何问题。 但是,在推理期间,由于我们在当前时间步上没有实际的前一个单词,因此会反馈前一个时间步上的预测单词。 每个时间步`t`的隐藏状态`h'[t]`在最终的最大 softmax `N`之前通过几个全连接层馈送。 在此 softmax 层中获得最大概率的单词是时间步长的预测单词。 然后将这个字输入到下一步的输入,即解码器 LSTM 的步骤`t + 1`
Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长获得预测的有效实现,如以下代码所示:
......@@ -255,7 +255,7 @@ Keras 中的`TimeDistributed`函数允许在解码器 LSTM 的每个时间步长
![](img/81b811e5-db95-4cf3-9d09-b9a0c7bff88e.png)
标签![](img/4c028cd4-d57a-489b-996e-b927c42f77cb.png)代表目标单词的一个热编码版本。 仅对应于实际单词的标签为`1`; 其余为`0`。 术语`Pi`表示实际目标单词是由`i`索引的单词的概率。 为了获得每个输入/输出推特对的总损耗`C`,我们需要对解码器 LSTM 的所有时间步长上的损耗求和。 由于词汇量可能会变得很大,因此在每个时间步骤中为目标标签创建一个热编码矢量![](img/870f6ff9-07dd-4ab8-8a31-f3ab8701361c.png)会很昂贵。 `sparse_categorical_crossentropy`损失在这里变得非常有益,因为我们不需要将目标单词转换为一个热编码矢量,而只需输入目标单词的索引作为目标标签即可。
标签`[y[i]], i = 1 -> N`代表目标单词的一个热编码版本。 仅对应于实际单词的标签为`1`; 其余为`0`。 术语`Pi`表示实际目标单词是由`i`索引的单词的概率。 为了获得每个输入/输出推特对的总损耗`C`,我们需要对解码器 LSTM 的所有时间步长上的损耗求和。 由于词汇量可能会变得很大,因此在每个时间步骤中为目标标签创建一个热编码矢量`y[t] = [y[i]], i = 1 -> n`会很昂贵。 `sparse_categorical_crossentropy`损失在这里变得非常有益,因为我们不需要将目标单词转换为一个热编码矢量,而只需输入目标单词的索引作为目标标签即可。
# 训练模型
......@@ -382,7 +382,7 @@ python chatbot.py --max_vocab_size 50000 --max_seq_len 30 --embedding_dim 100 --
| **参数** | **说明** | **用于训练的值** |
| `max_vocab_size` | 词汇中的单词数 | `50,000` |
| `max_seq_len` | 推文的最大长度应被限制到 LSTM | `30` |
| `hidden_state_dim` | LSTM 的隐藏状态![](img/f61bdf8c-d378-4af5-b4d5-8e1dde87a0bc.png)尺寸 | `100` |
| `hidden_state_dim` | LSTM 的隐藏状态`h`尺寸 | `100` |
| `embedding_dim` | 词嵌入的维度 | `100` |
| `learning rate` | 用于优化程序的起始学习率 | `0.0001` |
| `dropout` | 丢弃用于正则化目的 | `0.3` |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册