<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    
    <title>hannlp</title>
    
    
    <description>This website is a virtual proof that I&apos;m awesome</description>
    
    <link>https://hannlp.github.io/</link>
    <atom:link href="https://hannlp.github.io/feed.xml" rel="self" type="application/rss+xml" />
    
    
      <item>
        <title>长上下文语言建模综述</title>
        <description>
          
          Jiaheng Liu∗,†, Dawei Zhu∗,†, Zhiqi Bai★, Yancheng He★, Huanxuan Liao★, Haoran Que★, Zekun Wang★, Chenchen Zhang★, Ge Zhang★, Jiebin Zhang★, Yuanxing Zhang★, Zhuo Chen, Hangyu Guo, Shilong Li, Ziqiang Liu, Yong Shan, Yifan Song, Jiayi Tian, Wenhao Wu, Zhejian Zhou, Ruijie Zhu, Junlan Feng, Yang Gao, Shizhu He, Zhoujun Li,...
        </description>
        <pubDate>Mon, 14 Jul 2025 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2025-07-14-long-context-survery/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2025-07-14-long-context-survery/</guid>
      </item>
    
      <item>
        <title>神经机器翻译中的模型集成：经验之谈</title>
        <description>
          
          背景 集成学习是一种联合多个学习器进行协同决策的机器学习方法，通过整合多个学习器的决策结果可以有效减小预测结果的方差与偏置，显著提升模型的泛化能力，达到比单学习器更好的效果。对于神经机器翻译中的集成学习，实验室李北师兄的论文《On Ensemble Learning of Neural Machine Translation》针对NMT中的模型集成进行了大量的实验对比。本人也在不同规模的数据集上进行了尝试，将经验总结如下。 1 NMT中的模型集成方法 在模型层面，有模型参数平均和预测结果融合两种方法，两种方法相对独立，可以先做单个模型的检查点平均，再做不同模型的融合，都会带来提升。在数据层面，也可以通过finetuning和bagging两种策略构造子模型，这里暂不提及。 1.1 模型参数平均 即将单一模型最近保存的N个检查点的参数矩阵进行平均。 在fairseq中，可以通过以下工具实现： python ~/fairseq/scripts/average_checkpoints.py \ --inputs ckpts_dir --output ensemble_ckpt_path \ --num-epoch-checkpoints N --checkpoint-upper-bound U 有几个问题： 平均多少个检查点最好？这个需要自己尝试，基本就是5、10、15、20，很容易找到最适合的。 这些检查点保存的方式和间隔是多少？这与数据集的规模有关。大规模数据集（一般&amp;gt;2M）训练到最后会比较稳定，所以直接按照epoch保存，取最后的N个检查点即可。小规模数据集（一般10w-100w）训练到最后会出现过拟合，训练到一定程度后验证集ppl会不降反升。这里就需要更频繁的保存检查点，或者根据step，或者根据时间（Vaswani等建议每隔10分钟保存一次模型）。 1.2 预测结果融合 即在解码过程中，在经过Softmax得到归一化的目标语言词表上的概率分布后，整合不同模型得到的概率分布，进而预测下一个词。 由于不需要参数平均，那么模型的结构就不需要一致，这里又有两种手段构造子模型： 使用相同模型结构，不同的参数初始化分布或不同的随机初始化种子 使用不同的模型结构 在fairseq中，可以通过以下方式实现： 使用fairseq-generate和fairseq-interactive命令，传递--path模型地址时， 将多个模型的路径用:连接在一起。例：--path model1.pt:model2.pt 注意： 这些模型需要共享一个词表，也就是data-bin目录 由于要同时加载多个模型，所以可能需要用内存更大的cpu来进行生成（参数：--cpu） 2 实验步骤 这是师兄论文中比较关键的部分，将步骤和结果列在下面。 2.1 数据筛选 使用WMT18中英数据，平行语料16M，英文单语24M。还用了18CWMT平行语料9M。 对双语平行语料进行乱码过滤，剔除混有乱码的语料如控制字符、UTF-8转码生成的单字节乱码等...
        </description>
        <pubDate>Fri, 27 Aug 2021 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2021-08-27-model-ensemble-in-NMT/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-08-27-model-ensemble-in-NMT/</guid>
      </item>
    
      <item>
        <title>Notes of TorchText - a nlp tool</title>
        <description>
          
          前言 毕业设计中偷懒用了一些轮子，TorchText就是其中一个:)主要用了它来加载数据、构建词表、得到训练、测试及验证集的生成器等等。本篇博客主要记录一下我用过的，觉得非常有用、有趣的功能，方便回顾。 0 推荐资源 TORCHTEXT DOCUMENTATION (0.8.1) (官方文档，目前已更新到0.9.0) pytorch/text (官方github仓库，其readme是一个非常简洁的使用指南) How to use TorchText for neural machine translation, plus hack to make it 5x faster (一个优质的使用torchtext预处理机器翻译数据的教程) 版本提示： 在0.9.0版本中，之前版本的很多重要模块如torchtext.data、torchtext.datasets等已经移动到torchtext.legacy中了，导入时需要注意 1 TorchText 0.8.1总体介绍 from torchtext.legacy import data, datasets SRC = data.Field(pad_token=&apos;&amp;lt;pad&amp;gt;&apos;, batch_first=True) TGT = data.Field(init_token=&apos;&amp;lt;sos&amp;gt;&apos;, eos_token=&apos;&amp;lt;eos&amp;gt;&apos;, pad_token=&apos;&amp;lt;pad&amp;gt;&apos;, batch_first=True) test = datasets.TranslationDataset(path=&apos;./test&apos;, exts=(&apos;.en&apos;,...
        </description>
        <pubDate>Sun, 11 Apr 2021 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2021-04-11-Notes-of-TorchText-a-nlp-tool/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-04-11-Notes-of-TorchText-a-nlp-tool/</guid>
      </item>
    
      <item>
        <title>A comparison of Chinese word segmentation tools</title>
        <description>
          
          前言 中文分词在汉语机器翻译系统中是一个关键部分，我最近深有感触。本博客旨在对中文分词算法进行初步研究，并对现存的中文分词工具进行多方面的对比（注：已发现优秀的轮子，这个部分就不做了） 1 问题发现 前阵子遇到了一个很奇怪的事情，自己的Transformer可以成功翻译“我不爱你”，“我喜欢你”，却总是把“我爱你”翻译错。一开始怀疑是训练数据不匹配、或者模型没有学到这句话的知识，当时并没有在意。 Please input a sentence(zh): 我喜欢你。 I like you . Please input a sentence(zh): 我不爱你。 I don &amp;amp;apos;t love you . Please input a sentence(zh): 我爱你。 consider . 直到自己又实现并训练了基于LSTM的模型，发现依然无法翻译“我爱你”，才觉得这应该不是数据或模型的问题。偶然发现是分词这一步出错了。下面是我用jieba的分词情况： In [1]: import jieba In [2]: print(list(jieba.cut(&apos;我喜欢你。&apos;))) [&apos;我&apos;, &apos;喜欢&apos;, &apos;你&apos;, &apos;。&apos;] In [3]: print(list(jieba.cut(&apos;我不爱你。&apos;))) [&apos;我&apos;, &apos;不&apos;, &apos;爱&apos;,...
        </description>
        <pubDate>Sun, 11 Apr 2021 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2021-04-11-A-comparison-of-Chinese-word-segmentation-tools/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-04-11-A-comparison-of-Chinese-word-segmentation-tools/</guid>
      </item>
    
      <item>
        <title>Some Pytorch practices of LSTM</title>
        <description>
          
          前言 本篇博客记录了我对LSTM的理论学习、PyTorch上LSTM和LSTMCell的学习，以及用LSTM对Seq2Seq框架+注意力机制的实现。还包括了很多有趣的细节，包括RNNs对批量序列数据Padding的处理，以及多层RNNs中Dropout的使用等等。 1 LSTM速览 1.1 LSTM流程图 1.2 LSTM的关键 1.3 与RNN的对比 这里引用知乎-予以初始的回答，非常通俗易懂 RNN用于信息传输通路只有一条，并且该通路上的计算包含多次非线性激活操作。长记忆丢失是因为梯度消失，而梯度消失的主谋就是多层激活函数的嵌套，导致梯度反传时越乘越小（激活函数的导数&amp;lt;=1），乃至下溢出。所以后面的梯度传递不到前方，无法建立长时依赖。 LSTM引入了两条计算通道(C和h) 用于信息传输，其中C通道上的计算相对简单，较多的是矩阵的线性转换，没有太多的非线性激活操作。梯度反传时可以在C通道上平稳的传输到前方，从而建立长时依赖。所以C通道主要用于建立长时依赖，h通道用于建立短时依赖。 要说的是，LSTM的设计只是较RNN缓解了梯度消失问题，并没有完全解决。与Transformer的自注意力相比，LSTM的顺序输入的方式影响了模型的并行性，但符合人对序列的理解方式。 2 多层LSTM 层与层之间用于信息流通的其实还是隐藏状态$h_t^{(l)}$ 3 PyTorch中的LSTM 由于深度学习框架对模型成熟的封装，RNN这类模型的输入输出、使用方法基本一致。这里以LSTM为例，可以很容易的掌握其他所有RNNs。 在PyTorch中，有两种形式：LSTM和LSTMCell。两者的关系如上面多层LSTM的图中，一个蓝色块就是LSTMCell，所有蓝色块放在一起就是LSTM。下面是官方文档中LSTM和LSTMCell的公式： 3.1 LSTM 3.2 LSTMCell 4 PyTorch实践：Encoder-Decoder模型 4.1 用LSTM写Encoder # 由于成熟的封装，切换使用几种RNNs只需要换个名即可 str2rnn = {&apos;lstm&apos;: nn.LSTM, &apos;gru&apos;: nn.GRU, &apos;rnn&apos;: nn.RNN} class Encoder(nn.Module): def __init__(self, n_src_words, d_model, src_pdx, n_layers, p_drop, bidirectional,...
        </description>
        <pubDate>Mon, 05 Apr 2021 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2021-04-05-Some-Pytorch-practices-of-LSTM/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-04-05-Some-Pytorch-practices-of-LSTM/</guid>
      </item>
    
      <item>
        <title>Python Strengthening</title>
        <description>
          
          前言 最近在读源码的过程中，发现有很多陌生的python知识，包括装饰器、上下文管理器等，还有很多非常有用但我没见过的自带模块。于是采用“步步高点读机”式学习方法，哪里不会搜哪里（狗头，并将进一步学习的过程记录在此。 0 推荐资源 0.1 学习资源 Python documentation - 官方文档，最好的学习资源 Python Cookbook 3rd Edition Documentation - 是《Python Cookbook》的中文译本 《Python进阶》 - 是《Intermediate Python》的中文译本 0.2 开发资源 Google Python 风格指南 Abbreviations.com - 查单词缩写的网站，用于变量命名 1 Python进阶 1.1 装饰器 1.2 下划线的用法 1.2.1 在变量名中 模式 举例 含义 单前导下划线 _var 命名约定，仅供内部使用。通常不会由Python解释器强制执行（通配符导入除外），只作为对程序员的提示 单末尾下划线 var_ 按约定使用以避免与Python关键字的命名冲突 双前导下划线 __var 当在类内上下文中使用时，触发“名称修饰”。由Python解释器强制执行...
        </description>
        <pubDate>Mon, 25 Jan 2021 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2021-01-25-Python-Strengthening/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-01-25-Python-Strengthening/</guid>
      </item>
    
      <item>
        <title>使用fairseq从头训练一个中英神经机器翻译模型</title>
        <description>
          
          前言 本文在news-commentary-v15语料上训练了中英NMT模型，并将整个流程，包括工具和数据的准备、数据的预处理、训练及解码，以及中途遇到的问题和解决方案记录在此，希望能够给予别人一些帮助。 1 相关工具及目录结构 1.1 相关工具 除jieba是使用pip install安装外，其他几个工具都是建议直接克隆库到自己的用户目录中，方便使用其脚本(moses/subword-nmt)，或未来可能要自己拓展其中的模型(fairseq) Moses (一个SMT工具，在这里只会用到一些预处理脚本，如：tokenisation, truecasing, cleaning), 这是文档，安装指令如下： git clone https://github.com/moses-smt/mosesdecoder.git subword-nmt (使用BPE算法生成子词的预处理脚本)，安装指令如下： git clone https://github.com/rsennrich/subword-nmt.git jieba (中文分词组件)，安装指令如下: pip install jieba fairseq (一个基于PyTorch的序列建模工具), 这是文档，安装指令如下： git clone https://github.com/pytorch/fairseq cd fairseq pip install --editable ./ 1.2 目录结构与初始化 1.2.1 目录结构 提前组织一个目录结构的好处是可以让后面的一系列操作更加统一、规范化。下表中~代表linux系统中我的用户目录, v15news目录名代表此次我使用的数据集名称 ~ ├── mosesdecoder ├── subword-nmt ├──...
        </description>
        <pubDate>Sat, 16 Jan 2021 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2021-01-16-Use-fairseq-to-train-a-Chinese-English-translation-model-from-scratch/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-01-16-Use-fairseq-to-train-a-Chinese-English-translation-model-from-scratch/</guid>
      </item>
    
      <item>
        <title>Linux 使用记录</title>
        <description>
          
          前言 目前我采用了轻薄本+服务器的科研模式，笔记本系统是windows10，使用的一套软件是Xshell6(连接服务器) + WinSCP(文件传输) + Notepad++(文件编辑)，将常用技巧记录如下。 0 相关链接 Linux / Shell 教程 &amp;amp; Linux命令大全 - runoob Linux命令大全(手册) 一篇文章让你彻底掌握 Shell 语言 - 静默虚空 1 基础知识 1.1 Linux中路径的表示 可以使用pwd查看当前路径(从根目录开始) 绝对路径： Linux中，根目录从/开始 相对路径： . 表示当前目录，.. 表示上级目录，~ 表示当前用户自己的家目录，~user 表示用户名为user的家目录，这里的user是在/etc/passwd中存在的用户名 2 常用命令 2.1 进程相关 2.1.1 查看进程 查看某个用户的所有进程：top -U 用户名 查看某一进程的详细信息：ps aux | grep 任务号 2.1.2...
        </description>
        <pubDate>Fri, 15 Jan 2021 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2021-01-15-Linux-&-Shell-Usage-Record/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2021-01-15-Linux-&-Shell-Usage-Record/</guid>
      </item>
    
      <item>
        <title>A index - From word2vec, Transformer to NLP SOTA</title>
        <description>
          
          前言 之前看论文总想留下点什么痕迹(比如写个笔记)，但是发现有时候这也算是一种造轮子的行为，因为每个划时代的研究早就有无数人(包括大牛)写过总结，且已经总结的很好了。所以我反思了一下，这篇博客便诞生了，主旨是不为每篇经典单独造一个轮子，而是做一个索引，指向那些漂亮优秀的轮子(包括源码、总结等)。而我自己，只附上我对每一个模型的一段话总结(我希望每段话都是经过深思熟虑，总结到位的)。 1 词向量 1.1 word2vec 1.2 FastText 1.3 ELMo 2 预训练(语言)模型 2.1 Transformer 2.1.1 一段话总结 集self-attention及很多新技术为一体的特征抽取模型，特征结合的非常自然，且并行化程度极高。刚提出时是用于机器翻译的Encoder-Decoder结构，后面Encoder和Decoder都有单独被人拿出来做研究，且不断刷榜。目前在神经机器翻译已完成统治，20年在CV领域也大放异彩，21年竟然刷到了GAN的SOTA 2.1.2 模型源码 attention-is-all-you-need-pytorch - jadore801120 (pytorch版本，首推，无其他冗余代码) The Annotated Transformer - harvardnlp (pytorch版本，哈佛大学，有较多注释, 附中文版) tensor2tensor - tensorflow (tensorflow版本，官方实现，有较多冗余代码) 2.1.3 优质文章索引 了解篇(先读论文再阅读)： The Illustrated Transformer - Jay Alammar (首推，以图像形式详细介绍了计算细节，例如block中的$QKV$矩阵运算、多头、前馈部分，附中文版) Dissecting BERT Part 1: The Encoder...
        </description>
        <pubDate>Tue, 15 Dec 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-12-15-A-index-From-word2vec,-Transformer-to-NLP-SOTA/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-12-15-A-index-From-word2vec,-Transformer-to-NLP-SOTA/</guid>
      </item>
    
      <item>
        <title>Backward Propogation Through Time (BPTT) in RNN</title>
        <description>
          
          前言 RNN及其变种是一代经典，有必要认真学习。在推导了RNN的反向传播算法(BPTT)后，我发现一切反向传播算法都有普遍的规律：误差项都是有从后到前的递推关系的。RNN按时间步递推，其实与DNN中按层递推非常相似。在这里将推导过程记录下来，方便回忆，也希望能给别人一点启发。 1 符号定义及RNN模型结构 1.1 符号定义 下面是详细的符号定义： 符号 含义 维度 $\bm{x^{(t)}}$ 第$t$时刻的输入 $(K\times 1)$ $\bm{z^{(t)}}$ 第$t$时刻隐层的带权输入 $(N\times 1)$ $\bm{h^{(t)}}$ 第$t$时刻的隐含状态 $(N\times 1)$ $\bm{s^{(t)}}$ 第$t$时刻输出层的带权输入 $(M \times 1)$ $\bm{y^{(t)}}$ 第$t$时刻的输出 $(M\times 1)$ $E^{(t)}$ 第$t$时刻的损失 标量 $\bm{U}$ 隐层对输入的参数，整个模型共享 $(N\times K)$ $\bm{W}$ 隐层对状态的参数，整个模型共享 $(N\times N)$ $\bm{V}$ 输出层参数，整个模型共享 $(M\times N)$ $\bm{b}$ 隐层的偏置，整个模型共享 $(N\times 1)$...
        </description>
        <pubDate>Mon, 14 Dec 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-12-14-Backward-Propogation-Through-Time-(BPTT)-in-RNN/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-12-14-Backward-Propogation-Through-Time-(BPTT)-in-RNN/</guid>
      </item>
    
      <item>
        <title>Google Colab使用记录</title>
        <description>
          
          前言 本文介绍一个较良心的算力平台：Google Colab，记录一些使用技巧和感受，防止后来人踩坑。 1 初次使用Colab的配置 一般每天第一次打开Colab，或打开新的Notebook都需要重复如下操作： 1 选择gpu： 菜单栏 - 代码执行程序 - 更改运行时类型 - 硬件加速器 - GPU 选择GPU之后便可以用!nvidia-smi命令查看当前正使用的GPU。一般现在都是Tesla T4，很不错 2 挂载Google云端硬盘： 既可以直接鼠标点击挂载图标，也可以按照如下方式挂载： 在cell中输入： from google.colab import drive drive.mount(&apos;/content/drive&apos;) 运行后按提示操作即可 3 选择相应库的版本： 例： Colab默认的tensorflow版本是2.x的，如果需要使用1.x版本就需要手动切换，即在cell中输入以下代码： %tensorflow_version 1.x 运行后重启Colab即可。 遇到没有的库，直接!pip install即可 4 切换到当前工作路径： 右键一个文件或目录，即可看到复制路径的选项，有两种方法切换到该目录： 法1： 使用%cd命令 法2： 使用os.chdir()方法 2 使用技巧 2.1 尤其要注意 在cell中，其他linux命令都可以通过在前面加!使用(如!ls)，但cd命令需要用%cd才可以...
        </description>
        <pubDate>Sat, 12 Dec 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-12-12-Google-Colab-Usage-Rocord/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-12-12-Google-Colab-Usage-Rocord/</guid>
      </item>
    
      <item>
        <title>关于Softmax和CrossEntropyLoss</title>
        <description>
          
          前言 本文对NLP中常用的Softmax+CrossEntropyLoss组合的符号梯度进行推导，证明其巧妙之处。 1 关于Softmax 1.1 Softmax的形式 \[若\bm{x}=\begin{bmatrix} x_1\\ ...\\ x_i\\ ...\\ x_n\\ \end{bmatrix},那么\mathrm{Softmax}(\bm{x})=\begin{bmatrix} \frac{e^{x_1}}{\sum_ke^{x_k}}\\ ...\\ \frac{e^{x_i}}{\sum_ke^{x_k}}\\ ...\\ \frac{e^{x_n}}{\sum_ke^{x_k}}\\ \end{bmatrix}\] 若$\bm{y}=\mathrm{Softmax}(\bm{x})$，那么对于任意$y_i$有以下特点： $y_i\in(0,1)$，且$\sum_iy_i=1$，所以可以$y_i$当成属于类$i$的概率 在计算任意一个$y_i$时，都会用到所有$x_i$ 在计算任意一个$y_i$时，都会以$e$为底数，我们知道$e^x$会随着$x$的增大而急剧增大，这就会产生一种“大的更大，小的更小”的马太效应 1.2 一些其他细节 为什么叫这个名字？ 其实$\mathrm{Softmax}$就是$\mathrm{soft}$版本的$\mathrm{max}$。我们平时所说的$\mathrm{max}$，就是从多个值中选出一个最大的，这其实是$\mathrm{Hardmax}$。而$\mathrm{Softmax}$是分别给这些值一个相应的概率，另外由于其有马太效应，数值相差越大，概率相差也越大。如果给其前面加一个$\mathrm{log}$，那么就是$\mathrm{max}$的一个可微的近似 关于$\mathrm{Softmax}$其实还有很多细节，比如数值稳定性问题，本文就不一一展开讲了，可以参考Softmax vs. Softmax-Loss: Numerical Stability 这篇文章，是一篇不错的延伸 2 关于CrossEntropy Loss 2.1 CrossEntropy 给定两个概率分布$p,q$，其交叉熵为： \[H(p,q)=-\sum_xp(x)\mathrm{log}q(x)\] 它刻画了两个概率分布之间的距离。其中$p$代表正确分布，$q$代表的是预测分布。交叉熵越小，两个概率的分布越接近 2.2 CrossEntropy Loss 在分类问题中，提出了交叉熵损失。形式如同： \[C=-\sum_iy_i\mathrm{log}\hat{y_i}\] 其中，$y_i$为真实标签，$\hat{y_i}$为预测结果中对应的分布。在本篇文章中，$\hat{y_i}$就对应了网络最后一层第$i$个位置的输出$a_i$，也就是$\frac{e^{z_i}}{\sum_k^N e^{z_k}}$。 另外，当类别数仅为$2$时，$\mathrm{CrossEntropy Loss}$就变为：...
        </description>
        <pubDate>Thu, 03 Dec 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-12-03-The-Last-Layer-of-NN-for-Classification-Softmax-and-Cross-Entropy-Loss/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-12-03-The-Last-Layer-of-NN-for-Classification-Softmax-and-Cross-Entropy-Loss/</guid>
      </item>
    
      <item>
        <title>Full Matrix Method of mini-batch Back Propagation in DNN</title>
        <description>
          
          前言 在DNN的反向传播算法中，几乎所有教材都只使用单个样本(一个特征向量)进行相关公式的推导，而多个样本(也就是mini-batch，即多个特征向量组成的矩阵)反向传播的全矩阵方法对于理解“多样本”这一概念是非常重要的。所以花了一点时间推导了一下并记录在此，便于记忆，同时希望能对别人有所帮助。 0 几点说明 该文章是我上一篇博客Back Propagation and Gradient Calculation in Deep Learning(单样本反向传播)的后续版本，写作风格、符号表示与上篇类似，可以按顺序阅读 只要是变量(向量或矩阵)关于标量的梯度，其梯度的维度一定与其本身的维度相同，这可以作为很多梯度推导的检验方法 多样本在DNN的前向传播和反向传播中，样本(列)与样本(列)之间是毫无影响的。这一点符合直觉，也属于矩阵的特性，具体会在之后的推导过程中详细解释 1 变量定义 符号 含义 $N_l$ 第$l$层神经元数量 $\bm{X}$ $M$个输入样本，维度为($N_0\times M$) $\bm{Y}$ 这$M$个输入样本的标签，维度为($N_L\times M$) $W_{jk}^l$ 第$l-1$层第$\bm{k}$个神经元到第$l$层第$\bm{j}$个神经元的连接权重 $b_j^l$ 第$l$层第$j$个神经元的偏置 $Z_{j,m}^l$ 第$l$层第$j$个神经元对第$m$个样本的带权输入 $\sigma^l$ 第$l$层的激活函数 $A_{j,m}^l$ 第$l$层第$j$个神经元对第$m$个样本的输出 2 单样本到多样本的变化 变量定义已经给出，先说明一下多样本相对于单样本发生的变化 2.1 什么变了 输入和标签变了，均由一个列向量变成一个矩阵($M$个列向量)：\(\bm{x}\in \bm{\mathrm{R^{N_0}}}\rightarrow\bm{X}\in \bm{\mathrm{R^{N_0\times M}}}，\bm{y}\in \bm{\mathrm{R^{N_L}}}\rightarrow\bm{Y}\in \bm{\mathrm{R^{N_L\times M}}}\) 每一层的带权输入和输出变了，均由一个列向量变为一个矩阵($M$个列向量)：\(\bm{z^l}\in \bm{\mathrm{R^{N_l}}}\rightarrow\bm{Z^l}\in...
        </description>
        <pubDate>Mon, 30 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-30-Full-Matrix-Method-of-mini-batch-Back-Propagation-in-DNN/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-30-Full-Matrix-Method-of-mini-batch-Back-Propagation-in-DNN/</guid>
      </item>
    
      <item>
        <title>Some tips of PyTorch</title>
        <description>
          
          前言 在大三的时候已经使用PyTorch写过简单的DNN、CNN、预训练模型等，但当时只是被学分课(机器学习、计算机视觉)逼着写的，所以写完作业就基本不碰PyTorch了，也没有认真研究很多细节。现重新学习PyTorch，记录其很多重要但容易被忽略的细节，争取早日开始复现代码~ 0 推荐学习资源 PYTORCH DOCUMENTATION - 官方文档 《动手学深度学习》-PyTorch - 是 Dive-into-DL(第二版) 的PyTorch中文重构版本 pytorch-tutorial - 提供了很多非常简洁的模板代码，也很适合学习使用 1 经验细节汇总 1.1 数据操作 1.1.1 内存中的tensor 由于python对于变量在内存中的特殊储存方式，基于python的PyTorch也会因此受到影响，具体有以下几种形式： 像Numpy一样，对一个tensor使用索引操作(如new_tensor=tensor[1:])，索引出的结果与这个tensor共享内存(即修改一个，另一个也会跟着修改) 用.view()改变tensor的形状，返回的新tensor与源tensor共享内存(顾名思义，.view()仅仅改变对该张量的观察角度，内部数据并未改变)。所以如果想返回一个真正副本，推荐使用.clone.view()或.reshape() 使用.numpy()和.from_numpy()将tensor与Numpy中的array相互转换时，产生的tensor和array共享内存。如果这个tensor需要一个新的内存，那么可以使用torch.tensor()，这将消耗更多的时间和空间。 1.1.2 tensor的contiguous 顾名思义，连续的。PyTorch中张量的底层实现是使用C中的一维数组(一段连续的内存空间)，所以这里的连续是指在内存中是连续的。 使用.view()等方法时，必须先保证这个tensor是连续的(使用.is_contiguous()方法可以判断)。如果tensor在内存中不连续，则需要使用.contiguous()方法，他会重新开辟一块内存空间以保证连续。 .is_contiguous()的直观解释是tensor底层一维数组元素的存储顺序与tensor按行优先一维展开的元素顺序是否一致 PyTorch又提供了.reshape()方法，其实就等价于.contiguous().view() 下面是一个简单的示例： a = torch.randn(16) print(a.is_contiguous()) # True b = a.view(-1, 4) print(b.is_contiguous()) # True c = b.transpose(0, 1)...
        </description>
        <pubDate>Sat, 28 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-28-Some-tips-of-PyTorch/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-28-Some-tips-of-PyTorch/</guid>
      </item>
    
      <item>
        <title>Conda 使用记录</title>
        <description>
          
          前言 这篇博客记录了一些conda使用方法，以及一些常用深度学习库安装、配置的踩坑过程 1 基本使用 以下所有命令在2021-01-28被验证可用！另附官方文档 1.1 迅速安装 建议安装Miniconda，直接在这里找到对应的下载链接，右键复制链接，在服务器端用wget命令下载，bash命令安装。重启终端，即可使用conda命令。 1.2 基本配置 # 更新conda至最新版本，也会更新其它相关包 conda update conda # 添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ # 设置搜索时显示通道地址 conda config --set show_channel_urls yes # windows系统使用此命令后，会在你的C:\Users\用户名文件夹下会生成.condarc文件，在此文件里可以直接编辑(添加、删除)各种源 # 查看已经添加的源 conda config...
        </description>
        <pubDate>Thu, 26 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-26-Conda-Usage-Record/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-26-Conda-Usage-Record/</guid>
      </item>
    
      <item>
        <title>Machine Translation Notebook</title>
        <description>
          
          前言 nlp实验室肖桐老师、朱靖波老师主编的《机器翻译-统计建模与深度学习方法(第二版)》前些天已经略读了一遍(自然是跳过了统计机器翻译那两章#手动狗头)，再回头看时发现有很多知识又已经忘了，现打算再次精读此书，将遇到的所有重要的、需要推导或记忆的知识记录在本篇blog里，防止遗忘！ 1 简述神经机器翻译 神经机器翻译是深度学习神经网络推动下产生的第三代机器翻译技术，相对于前两代基于规则、统计的机器翻译技术而言，它无需设计规则、先验假设，而是直接使用Encoder-Decoder框架对分布式表示（Distributed Representation）的语言进行端对端映射，具有模型结构统一、译文质量高、对问题建模更为直接等优势，已成为时代主流。 注：在SMT时代，会对翻译过程进行假设(称为隐藏结构假设)，比如：源语言和目标语言的词或短语序列间存在某种对齐关系 2 机器翻译质量的评价 分为有参考答案评价(人工打分、BLEU)和无参考答案评价 2.1 BLEU(Bilingual Evaluation Understudy) 采用$n$-$gram$匹配+短句惩罚的方式 3 统计机器翻译部分 4 零碎的深度学习知识 4.1 稳定性训练 4.1.1 归一化 批量归一化(Batch Normalization)：沿着批次方向进行均值为0，方差为1的归一化。 层归一化(Layer Normalization)：归一化操作沿着嵌入方向进行 4.1.2 残差网络(Residual Networks) 采用跨层连接的结构，有$\bm{x_{l+1}}=F(\bm{x_l})+\bm{x_l}$。在反向传播时，在$\bm{x_l}$处的梯度为： \[\begin{aligned} \frac{\partial L}{\partial \bm{x_l}}&amp;amp;=\frac{\partial L}{\partial \bm{x_{l+1}}}\cdot\frac{\partial \bm{x_{l+1}}}{\partial \bm{x_l}}=\frac{\partial L}{\partial \bm{x_{l+1}}}(1+\frac{\partial F(\bm{x_l})}{\partial \bm{x_l}})\\ &amp;amp;=\frac{\partial L}{\partial \bm{x_{l+1}}}+\frac{\partial L}{\partial \bm{x_{l+1}}}\cdot\frac{\partial F(\bm{x_l})}{\partial \bm{x_l}}...
        </description>
        <pubDate>Mon, 16 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-16-Machine-Translation-Notebook/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-16-Machine-Translation-Notebook/</guid>
      </item>
    
      <item>
        <title>Some News Recommendation Models NPA/ NAML/ LSTUR/ NRMS</title>
        <description>
          
          前言 上上上次组会研一学长汇报了一篇数据集文章：MIND: A Large-scale Dataset for News Recommendation，是微软为新闻推荐而发布的一个数据集。在听汇报时我发现这个数据集非常符合我的需求： 首先，新闻推荐需要处理大量的文本信息，正与我未来方向(NLP)有较大关联 新闻中包含着大量的实体，有利于探索基于知识(知识图谱)的推荐方法 于是乎，我立马自己去找了这个MIND数据集，数据格式等就暂不介绍，有兴趣的可以自己去官网查看。在其论文中，微软官方实现了几个新闻推荐的算法，如下图: 其中，DKN这篇论文我在去年已经读过并研究过代码了，现在效果比它好的有四个，NPA，NAML，LSTUR和NRMS。我去找来并阅读了这四篇论文，发现第1，2，4篇是同一个人(Chuhan Wu,THU)发的…而且他也是第3篇的参与者。 本小菜鸡简单的在我的博客里写一下对这四篇论文的分析和理解~出场顺序大概就按照上图中实验结果从低到高吧^ ^ 0.几篇论文的共同点 因为这几篇论文的出处差不多，所以共同点非常多。 这四篇论文都是基于三个主要模块：新闻表示模型、用户表示模型和点击预测(包括之前的DKN也是)。其中，新闻表示模型通常都从新闻内容(如新闻标题，新闻类别，新闻内容，新闻内容中包含的实体)中学习，而用户表示通常从用户的浏览历史新闻中学习，点击预测即使用新闻表示和用户表示来计算用户点击这个新闻的概率 这四篇论文都大量使用了Attention Mechanism注意力机制(DKN在对用户建模时也使用了) 在总结的时候，对于共同之处，我会一笔带过，重点关注每篇论文真正创新的地方~ 1. NPA: Neural News Recommendation with Personalized Attention 1.1 核心思想 不同的用户会有不同的兴趣，同时每个用户往往有多种兴趣。所以，不同的用户可能会因为某个新闻的不同方面而点击这个新闻。 两个直观的感觉： 一个新闻标题中的不同单词往往会对用户产生不同的影响 并不是一个用户所浏览过的所有新闻都能反映他的偏好 基于这两个直觉，作者分别提出了word-level Attention的news model和news-level Attention的user model~ 1.2 模型 1.2.1 新闻表示模型 新闻表示模型在总模型图中用绿色虚线圈着。 对于每一个输入的新闻(就是其标题文本，一个单词序列)，使用新闻表示模型得到最终的表示向量。过程大概如下： 词嵌入。即使用词向量(word2vec/glove)技术，将标题中每个单词映射成其对应的向量表示，这样，新闻标题就变成了一个词向量序列$E=(\bm{e_1},…,\bm{e_M})$ 卷积神经网络。使用卷积神经网络的目的是想学习每个单词的局部上下文信息，也就是使用一个单词和其前后$k$个单词的表示，通过卷积操作来共同学习这个单词的表示。这样，得到一个新的单词表示序列$C=(\bm{c_1},…,\bm{c_M})$ 单词级别的注意力机制，是本篇论文的核心之一。其目的是：为标题中的每个单词，通过注意力机制得到一个权重。这些权重就可以体现用户对每个单词的关注度，再将所有单词加权平均，得到新闻标题，也就是新闻的最终表示 首先需要将每个用户的ID映射成一个向量$\bm{e_u}$(具体方法文中没有讲，可能是随机初始化最后学习得到的，需要去看代码了解)...
        </description>
        <pubDate>Wed, 11 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-11-Some-News-Recommendation-Models/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-11-Some-News-Recommendation-Models/</guid>
      </item>
    
      <item>
        <title>Back Propagation and Gradient Calculation in Deep Learning</title>
        <description>
          
          前言 这篇博客的初心 : 最近读的论文又用到LSTM了，发现对这些深度学习模型我还是只了解皮毛(前向传播)，不了解其底层原理(如参数的更新)，而我从接触深度学习开始就对反向传播充满了好奇，感觉这是个很难理解的事情。所以建立这篇博客慢慢从矩阵求导开始，慢慢推导所有深度学习模型的底层原理，从而加深自己的理解。 这篇博客内容 : 包括部分深度学习所需数学知识，以及各种深度学习模型(DNN,RNN等)的原理推导。 1 数学知识 注: 在本博客中，所有向量$\bm{v}$默认都为列向量 1.1 深度学习中几种常见的梯度计算 在神经网络中，很常见的求梯度类型求一个向量$\bm{v}$(如网络某一层的输出)或一个矩阵$\bm{W}$(如网络中的参数)的梯度，他们的实质其实都是多元函数求偏导。其中这个多元函数$f$(如损失函数)是以$\bm{v}$或者$\bm{W}$为自变量的实值函数。 1.1.1 求向量的梯度 \[若\bm{v}=\begin{pmatrix} v_1 \\ v_2 \\ ... \\v_n \end{pmatrix}，则\frac{\partial f}{\partial \bm{v}}=\begin{pmatrix} \frac{\partial f}{\partial v_1} \\ \frac{\partial f}{\partial v_2} \\ ... \\\frac{\partial f}{\partial v_n} \end{pmatrix}\] 1.1.2 求矩阵的梯度 同1.1.1，即使用$f$依次对矩阵的每一个元素求偏导，最后的结果仍然为一个矩阵。 2 深度神经网络(DNN)中反向传播的推导 由于网络上很多教程都是标量直接对向量或矩阵求导，非常难以理解。而一种很好的方式就是先对向量或矩阵的最小单元(元素) 求导，然后泛化到整个向量或矩阵。这在cs231n中也有提到： Work with small, explicit...
        </description>
        <pubDate>Fri, 06 Nov 2020 00:00:00 -0500</pubDate>
        <link>https://hannlp.github.io/2020-11-06-Back-Propagation-and-Gradient-Calculation-in-Deep-Learning/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-06-Back-Propagation-and-Gradient-Calculation-in-Deep-Learning/</guid>
      </item>
    
      <item>
        <title>Mathematics Strengthening</title>
        <description>
          
          前言 通过更新这篇博客，巩固我的数学基础，同时提高我对LaTeX语法的熟练程度~ 1 基础 1.1 充分必要条件 充分必要条件（英语：sufficient and necessary condition）简称为充要条件。 在逻辑学中： 当命题“若P则Q”为真时，P称为Q的充分条件，Q称为P的必要条件。 因此： 当命题“若P则Q”与“若Q则P”皆为真时，P是Q的充分必要条件，同时，Q也是P的充分必要条件。 当命题“若P则Q”为真，而“若Q则P”为假时，我们称P是Q的充分不必要条件，Q是P的必要不充分条件，反之亦然。 充分的含义是，一个命题A的成立足够保证另一个命题B的成立——如果我们知道A成立，那么我们可以“充分”认为B成立。必要的含义是，要使得某个命题B成立，我们必须要有A成立（因为A是B的推论，A的不成立将会否定B，所以把A称为B的必要条件）。 参考：1, 2 2 极限 等价无穷小 泰勒展开 $sinx\sim x$ $sinx=x-\frac{1}{3!}x^3$ $1-cosx\sim \frac{1}{2}x^2$ $cosx=1-\frac{1}{2}x^2+\frac{1}{4!}x^4$ $e^x-1\sim x$ $e^x=1+x+\frac{1}{2}x^2+\frac{1}{3!}x^3$ $tanx\sim x$ $tanx=x+\frac{1}{3}x^3$ $\mathrm{arctan}x\sim x$ $\mathrm{arctan}x=x-\frac{1}{3}x^3$ $ln(1+x)\sim x$ $ln(1+x)=x-\frac{1}{2}x^2+\frac{1}{3}x^3-\frac{1}{4}x^4+…$ $(1+x)^\alpha-1\sim \alpha x$ $(1+x)^\alpha=1+\alpha x+\frac{\alpha(\alpha-1)}{2!}x^2+…$ 口诀：指对连，三角断，三角对数隔一换。对数函数一二三，三角指数有感叹。知乎:weiyinfu $1. 当x\to0时，f(x)=x-sin(ax)与g(x)=x^2ln(1-bx)等价无穷小，求a,b.$ 解： \[\begin{aligned}...
        </description>
        <pubDate>Sun, 01 Nov 2020 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2020-11-01-Mathematics-strengthening/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2020-11-01-Mathematics-strengthening/</guid>
      </item>
    
      <item>
        <title>Matlab quickly check</title>
        <description>
          
          matlab与c的不同 逻辑运算 或’|’，与’&amp;amp;’ 取整运算 取下整:floor(a) 取上整:ceil(a) 文件读取 读取excel文件 xlsread(&apos;文件路径&apos;) matlab之导入EXCEL:错误，服务器出现意外情况 打开EXCEL，在文件→选项→加载项里。 在下方管理中选中“com加载项”把复选框勾掉即可。 向量（一维数组） x的欧式长度 norm(x) 元素方差/标准差 var(x)/std(x) x与y的内积 dot(x,y) 距离 norm(x-y) or sqrt(sum((x-y).^2)) 夹角 余弦值：dot(x,y)/(norm(x),norm(y)) 弧度：acos(余弦值) 角度:弧度*(180/pi) 维数\最大值\最小值\平均值\元素和\积 length(x)\max(x)\min(x)\mean(x)\sum(x)\prod(x) 元素排序 从小到大：sort(x) 从大到小：sort(x,&apos;descend&apos;) 元素位置 find(x[条件表达式]) 向量的生成(以下都为行向量) 以a为起点，k为步长,b为界 a:k:b 等差数列:以a为起点，b为终点，均匀取N个元素 linspace(a,b,N) 等比数列:以a为起点，b为终点，取N个元素 矩阵（二维数组） 矩阵的秩 rank(A) 矩阵的迹 trace(A) (A必须为方阵) 行列式 det(A) (A必须为方阵) 特征值/特征向量...
        </description>
        <pubDate>Wed, 05 Jun 2019 00:00:00 -0400</pubDate>
        <link>https://hannlp.github.io/2019-06-05-Matlab-quickly-check/</link>
        <guid isPermaLink="true">https://hannlp.github.io/2019-06-05-Matlab-quickly-check/</guid>
      </item>
    
  </channel>
</rss>
