暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

机器学习实战之_embedding理解与文本处理

量化分析之路 2020-05-09
904

什么是embedding呢  以大名鼎鼎的 word embedding来说

我个人的理解是用一个向量来代表这个word,这个向量是可学习的


在数学上表示一个maping: ,  function。

其中该函数满足两个性质:

  1. injective (单射的):就是我们所说的单射函数,每个X只有唯一的Y对应;

  2. structure-preserving(结构保存):比如在X所属的空间上 ,那么映射后在Y所属空间上同理

那么对于word embedding, 就是找到一个映射(函数)将单词(word)映射到另外一个空间(其中这个映射具有injective和structure-preserving的特点), 生成在一个新的空间上的表达,该表达就是word representation


很难理解 。说点通俗的 的。  转自  知乎


   @邱锡鹏老师的《神经网络与深度学习》里对这个的解释比较容易理解——对颜色的RGB表示法就属于一种典型的分布式表示:


    对于颜色,我们可以把它拆成三个特征维度,用这三个维度的组合理论上可以表示任意一种颜色。

      同理,对于词,我们也可以把它拆成指定数量的特征维度,词表中的每一个词都可以用这些维度组合成的向量来表示,这个就是Word Embedding的含义。

    当然,词跟颜色还是有很大的差别的——我们已经知道表示颜色的三个维度有明确对应的物理意义(即RGB),直接使用物理原理就可以知道某一个颜色对应的RGB是多少。但是对于词,我们无法给出每个维度所具备的可解释的意义,也无法直接求出一个词的词向量的值应该是多少。所以我们需要使用语料和模型来训练词向量——把嵌入矩阵当成模型参数的一部分,通过词与词间的共现或上下文关系来优化模型参数,最后得到的矩阵就是词表中所有词的词向量。

        这里需要说明的是,有的初学者可能没绕过一个弯,就是“最初的词向量是怎么来的”——其实你只要知道最初的词向量是随机初始化的就行了。嵌入矩阵最初的参数跟模型参数一样是随机初始化的,然后前向传播计算损失函数,反向传播求嵌入矩阵里各个参数的导数,再梯度下降更新,这个跟一般的模型训练都是一样的。等训练得差不多的时候,嵌入矩阵就是比较准确的词向量矩阵了



1:代码部分导入模块

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf


from tensorflow import keras


print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)

2. 读取数据  这次用的是keras自带的imdb  电影评论网站  被分为两类  positive negative.对数据集进行二分类


num_words = vocab_size  个数
index_from = index_from   index从几开始算


imdb = keras.datasets.imdb
vocab_size = 10000
index_from = 3
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(
num_words = vocab_size, index_from = index_from

3.载入词典  key为具体的词语 value为id

word_index = imdb.get_word_index()
print(len(word_index))
print(word_index)

4  字符处理

word_index['<PAD>'] = 0        是否pad
word_index['<START>'] = 1       开始起始字符
word_index['<UNK>'] = 2         寻找字符
word_index['<END>'] = 3 结束字符


reverse_word_index = dict(
[(value, key) for key, value in word_index.items()])


def decode_review(text_ids):
return ' '.join(
[reverse_word_index.get(word_id, "<UNK>") for word_id in text_ids])


decode_review(train_data[0])

max_length = 500


train_data = keras.preprocessing.sequence.pad_sequences(
train_data, # list of list
value = word_index['<PAD>'],
padding = 'post', # post, pre
maxlen = max_length)


test_data = keras.preprocessing.sequence.pad_sequences(
test_data, # list of list
value = word_index['<PAD>'],
padding = 'post', # post, pre
maxlen = max_length)


print(train_data[0])

5 定义模型

embedding_dim = 16    #每个word embedding为长度16
batch_size = 128


model = keras.models.Sequential([
# 1. define matrix: [vocab_size, embedding_dim]
# 2. [1,2,3,4..], max_length * embedding_dim
# 3. batch_size * max_length * embedding_dim
keras.layers.Embedding(vocab_size, embedding_dim,
input_length = max_length),
# batch_size * max_length * embedding_dim
# -> batch_size * embedding_dim
keras.layers.GlobalAveragePooling1D(),
keras.layers.Dense(64, activation = 'relu'),
keras.layers.Dense(1, activation = 'sigmoid'),
])


model.summary()
model.compile(optimizer = 'adam', loss = 'binary_crossentropy',
metrics = ['accuracy'])


6 训练模型

history = model.fit(train_data, train_labels,
epochs = 30,
batch_size = batch_size,
validation_split = 0.2)


7 测试准确率

def plot_learning_curves(history, label, epochs, min_value, max_value):
data = {}
data[label] = history.history[label]
data['val_'+label] = history.history['val_'+label]
pd.DataFrame(data).plot(figsize=(8, 5))
plt.grid(True)
plt.axis([0, epochs, min_value, max_value])
plt.show()

plot_learning_curves(history, 'accuracy', 30, 0, 1)
plot_learning_curves(history, 'loss', 30, 0, 1)

这是一个初级的embedding网络,下节课学习传统的RNN实现文本分类



文章转载自量化分析之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论