文本预处理
建立字典
记一个文本预处理需要用到的字典,学习一下python
class Vocab(object):
def __init__(self, tokens, min_freq=0, use_special_tokens=False):
counter = count_corpus(tokens) # :
self.token_freqs = list(counter.items())
self.idx_to_token = []
if use_special_tokens:
# padding, begin of sentence, end of sentence, unknown
self.pad, self.bos, self.eos, self.unk = (0, 1, 2, 3)
self.idx_to_token += ['', '', '', '']
else:
self.unk = 0
self.idx_to_token += ['']
self.idx_to_token += [token for token, freq in self.token_freqs
if freq >= min_freq and token not in self.idx_to_token]
self.token_to_idx = dict()
for idx, token in enumerate(self.idx_to_token):
self.token_to_idx[token] = idx
def __len__(self):
return len(self.idx_to_token)
def __getitem__(self, tokens):
if not isinstance(tokens, (list, tuple)):
return self.token_to_idx.get(tokens, self.unk)
return [self.__getitem__(token) for token in tokens]
def to_tokens(self, indices):
if not isinstance(indices, (list, tuple)):
return self.idx_to_token[indices]
return [self.idx_to_token[index] for index in indices]
def count_corpus(sentences):
tokens = [tk for st in sentences for tk in st]
return collections.Counter(tokens) # 返回一个字典,记录每个词的出现次数
语言模型
n元语法和马尔可夫假设
马尔可夫假设:一个词的出现只与前面n个词有关
n元模型的缺陷
1.参数空间大
p(w1)p(w2|w1)p(w3|w1,w2)
v + v**2 + v**3
2.数据稀疏
齐夫定律:大多数单词的频率很小
循环神经网络
基于n元模型的理论,避免缺陷
时序数据:时序数据的一个样本通常包含连续的字符
采样方式:随机采样和相邻采样。
随机采样和相邻采样示例(来自评论区)
听完课之后总结了一下随机采样和相邻采样,并且花了点时间画了一下自己理解的原理图,如果有错误请大家指出来。
本次课程中,讲课的老师讲的非常的详细,包括前面语言模型,N元模型,都非常的清楚。
建议第一次没有看懂的同学多看几次。
循环神经网络
循环神经网络
梯度衰减或梯度爆炸
反向传播方式:通过时间反向传播,BPTT(针对循环层的训练算法)
梯度是幂的形式,指数是时间步数
应对方法:裁剪梯度(只能应对梯度爆炸)
\min\left(\frac{\theta}{|\boldsymbol{g}|}, 1\right)\boldsymbol{g}
超参数
在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。 通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。
epoch
深度学习中 number of training epochs 中的 epoch到底指什么?
回答一
epoch:1个epoch表示过了1遍训练集中的所有样本。
RNN的state
定义模型RNN中的state维护一些状态,都是维护哪些状态,这些状态具体什么作用和效果呢?
对于RNN来讲,就是隐藏状态H,因为RNN在计算H_{t}时会用到H_{t-1},所以需要维护这个状态