目录
一、基础知识
1、lstm
(1)B站 李宏毅机器学习课程
(2)部分网友对应的课件文章:
(3)损失函数
(4)优化方法选择:
(5)这种组合的优势:
(6)lstm相较于普通RNN的优势:
2、crf
(1)课程
(2)为什么用crf而不是hmm
(3)维特比算法
二、代码部分知识
1、rnn_cell 对应参数
2、lstm 的输入、输出维度,尤其双向RNN的输入、输出维度?
(1)隐藏层、输入、输出维度
(2)动态RNN和双向动态RNN网络结构
(3)双向rnn的反向理解
3、cell.zero_state(batch_size),为什么参数跟batch_size相关?
4、tf.concat([t1,t2],axis)
5、其他关键理解点:
三、全部代码:
台大李宏毅机器学习(一)——RNN&LSTM_zhaochs的博客-CSDN博客_lstm李宏毅课件下载地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/RNN (v2).pdf视频:https://www.bilibili.com/video/av9770190/?p=25讲解LSTM最好的文章:http://colah.github.io/posts/2015-08-Understanding-LSTMs/...https://blog.csdn.net/weixin_41753033/article/details/95937154
[机器学习入门] 李宏毅机器学习笔记-33 (Recurrent Neural Network part 2;循环神经网络 part 2)_holeung的博客-CSDN博客
交叉熵损失函数:
简单的交叉熵损失函数,你真的懂了吗? - 知乎
之前学习吴恩达课程的第二课的时候,有整理如下:
吴恩达-深度学习微课-第二课_月笼纱lhz的博客-CSDN博客
deep 网络学习x到y之间的关系,crf学习y之间的约束规则
lstm可以解决梯度vanishing的问题(not gradient explode),具体的就是在普通RNN的机构中,memory cell 是每个时刻都在更新的,而在lstm中 根据公式 memory的更新 是要加上当前input的,所以如果input gate 和 forget gate如果配合的话,input一旦产生影响就会一直存在的,不会消失;而对于爆炸的问题,我们就learning_rate 调小一点,慢慢调参;
这样就不会出现RNN非常难训练的问题,一会儿需要large learning rare,一会儿需要small learning rate
L1、L2正则化和Dropout——李宏毅深度学习笔记(七) - 知乎
dropout是防止过拟合的一种方法,但是在训练的时候会使用dropout(所以每个batch训练的时候),而在测试的时候并不会(但是需要调整权重w=w*(1-p));
从玄学上解释为什么会起作用就是:觉得队友可能指望不上的时候,每个人就要更强,而当实际测试时,每个人都出现了都是更强了,所以整体就更强;
从机器学习相关算法上理解,就先dropout又最终汇总的过程,就有点像ensemble算法,所以整体性能最终会是强的;
视频课程可以在B站上看,转换成文字的文章可参考如下博客
李宏毅机器学习:HMM/CRF_梆子井欢喜坨的博客-CSDN博客
crf有优势:一方面权重W可训练,特征函数可自定义;另一方面是无向图,隐状态不像hmm中仅跟前一状态有关,而是前后都会有关
总结CRF与HMM有什么区别?_哔哩哔哩_bilibili
如何通俗地讲解 viterbi 算法? - 知乎
bilistm+crf结合的模型中,bilstm输出x-->y的可能状态及对应概率,crf 输出y之间的转移概率,最终x到底对应哪条y序列,就是靠维特比算法将这两方面结合选出一条得分最高或者说距离最近的路。
如何通俗地理解概率论中的「极大似然估计法」? - 知乎
简单理解就是根据发生情况,结合似然函数,推测参数的过程;
跟概率是有点反着的过程,知道了概率,来推测情况;
BiLSTM中的CRF层(三)CRF损失函数_带着小板凳学习的博客-CSDN博客_crf损失函数
关键点:1,bilstm_crf 模型损失函数用的是crf的loss函数,是(真实路径分数)/(所有路径分数得分),真实路径分数好计算=发射分数(来自bilstm层)+转移分数 ;2,所有路径分数用不着num_tags**words次方,有点类似维特比算法思想/动态规划思想;
常见的隐藏单元数hidden_size需设置、激活函数activation默认tanh,state_is_tuple默认是true即可影响的是输出形式,forget_bias也初始化设置为1即可
tensorflow 笔记8:RNN、Lstm源码,训练代码输入输出,维度分析 - 细雨微光 - 博客园
tensorflow笔记6:tf.nn.dynamic_rnn 和 bidirectional_dynamic_rnn:的输出,output和state,以及如何作为decoder 的输入 - 细雨微光 - 博客园
反向的过程就是做了两次reverse
1. 第一次reverse
:将输入序列进行reverse
,然后送入dynamic_rnn
做一次运算.
2. 第二次reverse
:将上面dynamic_rnn
返回的outputs
进行reverse
,保证正向和反向输出的time
是对上的.
注:这也是为什么state中后向的h对应的是output后向中的“第一个”,但都表示最后时刻的意思
每个样本需要初始化h,c,所以跟batch_size 相关
lstm的状态初始化为什么要有batch_size这个参数? - 知乎
tf.concat()详解_木盏的博客-CSDN博客_tf.concat
以二维数组举例,axis=0,1,如果是axis=0,则相当于增加行,axis=1则相当于增加列;
axis从小到大的顺序也对应着方括号从外道理的顺序
tf.reshape函数用法&理解_csdn0006的博客-CSDN博客_tf.reshape
(1)RNN-cell 是共享权重、也就是一个cell,只是为了形式上方便理解所以一般的图都画成了展开的形式;
(2)rnn里也要设置隐藏单元数,cell中包含的1个隐藏单元 就类比于 MLP中隐层的一个隐藏单元
(3)embedding理解,对比着one_hot 去理解,one_hot实现是对照着词典,如果词典中有10000个词,那每个字符的表示就是10000维,这种表示方法有两大缺点:第1是冗余存储,因为只有一个1,其他都是0;第2是无法计算相似词的相似性;embedding的实现有两大好处:第1是维度大大降低,300维,500维都可以;第2是可以计算相似性 ;因为embedding 是选取了一些特征作为维度,例如性别、贵族、颜色等等的,每个字符根据这些特征进行取分值;目前代码中见到的就是定义一个embedding维度数即可,没看到特征从哪里选出来的,吴恩达的课程里提到这没有人知道,是从训练集里来的(没有完全get,后续再说);
(4)梯度裁剪
tensorflow clip_by_norm函数理解_linuxwindowsios的博客-CSDN博客_tf.clip_by_norm
tf.clip_by_global_norm理解_mstar1992的博客-CSDN博客_clip_by_global_norm
(5)程序中yield关键字
生成一个生成器,无法直接打印,后续需结合着for循环使用
Python高级用法之yield关键字_木盏的博客-CSDN博客
(6)维特比解码
Tensorflow 中 crf_decode 和 viterbi_decode 的使用_zwglory的博客-CSDN博客_crf.crf_decode
(7)模型的保存与加载中的路径问题,tf.train.save,tf.train.latest_checkpoint 使用
模型加载有两种方式:
一种:加载模型结构、加载模型中变量
二种:有模型代码、只需加载 模型好的变量取值,接下来描述这种方式
[483]tensorflow模型保存和读取tf.train.Saver_周小董的博客-CSDN博客
举例说明path之间的关系
path ='D:/train/' #这也就是checkpoint文件的路径,是tf.train.latest_checkpoint的参数路径
save_path=os.path.join(path, 'model.ckpt') #是path文件夹,但是生成的3个文件有model.ckpt前缀
saver = tf.train.Saver()
saver.save(sess, save_path, global_step=step)
调用时 :
model_file=tf.train.latest_checkpoint(path) #注意括号里用的是path路径
saver.restore(sess,model_file)
tf.nn.embedding_lookup() 详解 - 简书
这里面例子说明的清楚
06:Tnsorflow的可视化工具Tensorboard的初步使用_王小小小草的博客-CSDN博客_tensorboard标签(空格分隔): 王小草Tensorflow笔记笔记整理者:王小草 笔记整理时间:2017年3月7日 代码原文请见github:当使用Tensorflow训练大量深层的神经网络时,我们希望去跟踪神经网络的整个训练过程中的信息,比如迭代的过程中每一层参数是如何变化与分布的,比如每次循环参数更新后模型在测试集与训练集上的准确率是如何的,比如损失值的变化情况,等等。如果能在训练的过...https://blog.csdn.net/sinat_33761963/article/details/62433234?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164999337216780274138254%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164999337216780274138254&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-62433234.142%5Ev9%5Epc_search_result_cache,157%5Ev4%5Econtrol&utm_term=tensorflow++tensorboard&spm=1018.2226.3001.4187
大概简化步骤:
>标量定义:tf.summary.scalar,(可以定义很多)
>定义合并:merged_summary = tf.summary.merge_all()
>日志路径:writer = tf.summary.FileWriter(path),writer.add_graph(session.graph)或
writer = tf.summary.FileWriter(path,session.graph)
>运行summary: train_summary=session.run(merged_summary)
>O可选,如果区分train日志路径和test日志路径,到这步后进行train_writer.add_summary(train_summary)或者
test_writer.add_summary(test_summary),这样就区分到了不同的日志路径中
add_summary 后才能在tensorboard 查看到
>程序执行:产生日志文件
>日志运行:命令行执行命令
(1)打开Anaconda prompt ,激活tensorflow(我之前定义的tensorflow 环境名称叫tf)
conda activate tf
(2)=等号后面加上summary日志保存的文件夹路径
tensorboard --logdir=
>tensorboard查看:web端查看 (我这个需要关闭WiFi才可以打开,木仔细了解原因)
待补充: