深度学习实战:语句的相关度分析(LSTM)
数学原理:
嵌入层:
X(嵌入向量)=V*v(索引向量)
LSTM层:
i=Wxi+Uhi+b
f=Wxi+Uhi+b
o=Wxi+Uhi+b
c=Wxi+Uhi+b
输出层:
分别将左右两个句子进过模型后得到的向量使用曼哈顿距离 exp(−||se− se||)∈ [0, 1]来衡量相似性度,进行优化。
其中
1:V是索引向量的系数,(1)词汇表的大小(Vocabulary Size):假设词汇表v的大小是 L,嵌入矩阵需要为 L 个不同的词汇提供嵌入表示。(2)嵌入维度(Embedding Dimension):这是每个词汇的嵌入向量的维度,通常表示为 d。V的大小就是L*d。令len(vocabulary)是词汇表的长度
2:LSTM层的输入是嵌入向量,而不是索引向量。xi属于X,代表的是嵌入后的一个向量,X的大小为input_dim(L*d)。故而xi的模长为embeding_dims,xi的系数W的size为=[ hidden_size,embeding_dims]
3:embeding_dims是每个tokens对应的维度,即嵌入向量的维度。每个词汇将被表示为一个 embedding_dim 维的向量。
4:hidden_size代表的是每一个时间步的维度,即,每一个embeding_dims里的分量都进入一个为hidden_size长的隐藏层。
5:hi是上一个时间步的值,模长为hidden_size,它对应的系数为U,模长也为hidden_size。
所以最终需要训练的参数为:
嵌入层:len(vocabulary)*embeding_dims
LSTM层:对每一个xi,都有4*(hidden_size*embedding_dim (系数W)+ hidden_size*hidden_size (系数U)+hidden_size)。因而总共需要再乘上len(vocabulary)的大小
理论原理:
语句的相关度是指,两个句子在语言,结构上的相似程度。为了实现语句的相关度分析,需要我们把控语句的整体含义,所以我们需要将每一个句子里的词语,按照语句的顺序,全部关联起来。例如:How can I be a good geologist?,需要把how,be,geologist,等里面所有的词语全部联系起来才能理解语句的意思。同时与句子,What should I do to be a great geologist?进行相关度分析。
在训练的过程中,示例1:How can I be a good geologist?,What should I do to be a great geologist?,1(语句含义一样)
模型会学习训练集的特征来更新模型的参数,(当成立示例1时的满足的参数),当训练集足够大时,模型的预测性好,泛化能力强。
数据处理:
- 先对数据进行正则化处理,删除句子里的“无用词”以减少其对理解句子含义的难度
train_df = pd.read_csv('train.csv')
test_df = pd.read_csv('test.csv')
print(len(train_df), len(test_df))
train_df.head()
stops = set(stopwords.words('english'))
def preprocess(text):
# input: 'Hello are you ok?'
# output: ['Hello', 'are', 'you', 'ok', '?']
text = str(text)
text = text.lower()
text = re.sub(r"[^A-Za-z0-9^,!.\/'+-=]", " ", text) # 去掉其他符号
text = re.sub(r"what's", "what is ", text) # 缩写
text = re.sub(r"\'s", " is ", text) # 缩写
text = re.sub(r"\'ve", " have ", text) # 缩写
text = re.sub(r"can't", "cannot ", text) # 缩写
text = re.sub(r"n't", " not ", text) # 缩写
text = re.sub(r"i'm", "i am ", text) # 缩写
text = re.sub(r"\'re", " are ", text) # 缩写
text = re.sub(r"\'d", " would ", text) # 缩写
text = re.sub(r"\'ll", " will ", text) # 缩写
text = re.sub(r",", " ", text) # 去除逗号
text = re.sub(r"\.", " ", text) # 去除句号
text = re.sub(r"!", " ! ", text) # 保留感叹号
text = re.sub(r"\/", " ", text) # 去掉右斜杠
text = re.sub(r"\^",