Lecture 9: Practical Tips for Final Projects

在这里插入图片描述

The Final Project

  • 要么做默认的项目——SQuAD问答
  • 要么自己找一个项目——必须要TA/prof/post/PhD同意
  • 可以使用任何语言/框架,推荐使用Pytorch

The Default Final Project

Building atextualquestionanswering systemforSQuAD
数据集:https://rajpurkar.github.io/SQuAD-explorer/
任务示例:
在这里插入图片描述
应注意的几个点
在这里插入图片描述

Project Proposal

  1. 找一个与你的主题相关的研究论文
    对于默认的项目,在SQuAD榜单上的一篇论文就可以,但你或许应该从其他地方寻找一些有意思的QA/reading 相关工作
  2. 写一篇研究论文的摘要,描述你希望如何使用或获取它的思想,以及你计划如何扩展或改进它到你的最终项目工作中
  3. 根据需要描述,特别是对于定制项目:
    一个项目计划,相关的现有文献,你将使用/探索的模型的种类;你将使用的数据(以及如何获得),以及你将如何评估成功。

Project Milestone

  • 这是一份进度报告
  • 你不应该半途而废!
  • 描述你所做的实验
  • 描述获得的初步结果
  • 描述你打算如何度过剩下的时间

预计到目前为止,你已经实现了一些系统,并有了一些初步的实验结果(某些不寻常的项目除外)

Finding Research Topics

对于所有的科学,都有一下两种开始的方法

  • [钉子]从感兴趣的(域)问题开始,并尝试找到比当前已知/使用的更好/更好的解决方法
  • [锤子]从感兴趣的技术方法开始,找出扩展或改进它的好方法或新的应用方法

Project types
这不是一个详尽的列表,但大多数项目是其中之一

  1. 兴趣的应用/任务,探索如何有效地接近/解决它,通常应用现有的神经网络模型
  2. 实现一个复杂的神经架构并在一些数据上演示其性能
  3. 提出一种新的或变异的神经网络模型并探索其实证成功
  4. 分析项目。分析一个模型的行为:它如何表示语言知识,它能处理什么样的现象或它所犯的错误
  5. 稀有理论项目:显示模型类型、数据或数据表示的一些有趣的、非平凡的属性

一些例子

  1. 使用词级别和字符级别的莎士比亚分格诗歌生成
    提出了门控LSTM
    在这里插入图片描述

在这里插入图片描述
3.
在这里插入图片描述
4.
在这里插入图片描述
How to find an interesting place to start?

  • 看ACL论文选集https://aclanthology.info
  • 也可以看主要的机器学习会议:NeurIPS,ICML,ICLR
  • 看cs224n过去的项目
  • 看看在线预印本服务器,尤其是: https://arxiv.org
  • 甚至可以在现实生活中找一个有趣的问题

一个统计各种任务当前最优解决方案的网站
https://paperswithcode.com/sota

**Finding a topic **

图灵奖获得者、斯坦福大学名誉教授艾德·费根鲍姆说,要听从他的导师艾未未先驱、图灵奖和诺贝尔奖获得者赫伯·西蒙的建议:
“如果你看到一个有很多人工作的研究领域,就去别的地方。”
“If you see a research area where many people are working, go somewhere else.”

对于大多数自定的项目,必须含有

  • 合适的数据,Usuallyaimingat:10,000+ labeled examples by milestone
  • 可行的任务
  • 自动评价标准
  • NLP是项目的中心

Finding data

  • 可以自己收集数据
    • 模型可能采用无监督数据
    • 可以自己标注少量数据
    • 可以找一个提供有效标注的网站,比如likes,stars,ratings等等
  • 大多数人使用前人建立的数据集

一些数据来源

再看门控循环单元和MT

直觉上,RNN会发生什么?

  1. 衡量过去对未来的影响
    在这里插入图片描述
    如上图,相同颜色为所指。使用了链导法则,上式表明了过去( h t h_t )对未来( l o g p ( x t + n x < t + n ) logp(x_{t+n}|x_{<t+n}) )的影响,此影响用未来的误差对现在的偏导衡量
  2. 在t处的扰动是如何影响 l o g p ( x t + n x < t + n ) logp(x_{t+n}|x_{<t+n}) 的?
    在这里插入图片描述

Backpropagation through Time

问题:梯度消失是个大问题

  • 当梯度为0时,我们无法判断
    1. 数据中t和t+n之间没有依赖关系,或者
    2. 参数配置错误(消失梯度条件)
  • 普通RNN是否存在这个问题
    在这里插入图片描述
    存在,如下图,会导致梯度消失
    在这里插入图片描述

Gated Recurrent Unit

  • 这意味着错误必须通过所有中间节点反向传播:
    在这里插入图片描述
  • 也许我们可以创建自适应的快捷连接
    在这里插入图片描述
    上图与HighwayNet很像,通过 u t u_t 向量控制哪部分数据(更新后的 ( ^ h t ) \hat (h_t) 还是未更新的 h t 1 h_{t-1} )传递下去
  • 或者让网络自适应地剪除不必要的连接在这里插入图片描述
    注意图中的颜色,与上一种方法相比,这种方法增加了一个重置门。不再是全盘接收上一个时间步的隐藏状态,而是使用向量 r t r_t 来控制。

下面用图来总结普通RNN和门控RNN

  • 普通RNN:对于前一时间步的输出全盘读取,然后全盘更新
    在这里插入图片描述

  • 门控RNN:
    改进在于

    • 不再是全盘读取,而是选择一个可读取子集,通过向量 γ \gamma 来决定前一时间步的输出 h h 有多少参与下一时间步的更新
    • 不再是全部更新到下一时间步,而是选择一个可写子集,通过向量 u u 来决定哪些数据( h h 还是 γ h \gamma \cdot h )选择为下一时间步的输出
      在这里插入图片描述
      注:
      • 门控循环单元更加实际一些
      • 这里的思想与注意力有些重叠
  • 两个最常用的门控循环单元:GRU和LSTM
    GRU和我们之间讲的门控RNN差不多,而LSTM有三个门,其中两个来控制从之前的时间步读取多少内容,一个控制向下一时间步传递多少内容。
    在这里插入图片描述

    • LSTM的计算图
      在这里插入图片描述
      LSTM将所有的操作都用作门,所以所有的东西都可以被遗忘或者忽视。
      在这里插入图片描述
      底部非线性的更新就和普通RNN相同
      在这里插入图片描述
      上图中的这部分是关键点,这里没有使用乘,而是使用了加,将非线性的部分与 c t 1 c_{t-1} 相加得到 c t c_t ,类似 c t c_t c t 1 c_{t-1} 之间增加了一个直接的线性连接。(与最近出现的一些新的架构很类似,如ResNets)

The large output vocabulary problem in NMT (or all NLG)

在这里插入图片描述

  • 在seq2seq任务中,我们在解码器部分生成目标序列时,在每个时间步都使用softmax对词表中所有单词求生成概率。这样会消耗大量计算资源
  • 词生成问题:词表规模适中,通常为50K

可能的解决方法

  • Hierarchical softmax:树结构的词表
  • Noise-contrastive estimation:binary classification
  • 一次训练一部分词汇;测试一组可能的翻译:Jean, Cho, Memisevic, Bengio. ACL2015
  • 使用注意力弄清楚你在翻译什么:你可以做一些简单的事情,比如查字典
  • 更多的想法:单词片段;char。模型

MT评价

  • 人工评价
    • 忠实度和流利度(5 or 7个分数段)
    • 错误分类
    • 翻译排名比较(例如人工判断两个翻译哪一个更好)
  • 在一个应用中测试,将MT作为子组件
    • 例如,外语文献问答
      • 可能无法测试翻译的许多方面(例如,跨语言信息检索)
  • 自动评测:BLEU、其余如TER,METEOR

BLEU Evaluation Metric

(Papineni et al, ACL-2002)

  • n-gram精确度(分数介于0~1)

    • n-gram既能衡量忠实度和流利度
    • 对不同n-gram结果几何平均加和
  • 简短惩罚:短的句子更容易得到高分,因此对较短的句子乘一个惩罚
    具体计算例子:https://www.cnblogs.com/by-dream/p/7679284.html

  • 初始的结果显示BLEU分数与人类判断具有线性相关
    在这里插入图片描述

  • MT的自动评测

    • 人们开始优化系统来提高BLEU分数
      • BLEU分数很快增加
      • 但BLEU与人类对质量的判断之间的相关性一直在下降
      • BLEU的分数现在接近人工翻译的分数,但它们的真实质量仍然远远低于人工翻译
    • 提出自动机器翻译评估已经成为它自己的研究领域
      • 有很多建议:TER,METEOR,MaxSim,SEPIA,RTE-MT
      • TERpA 是一个具有代表性的,好处理一些词的选择变化的度量
    • MT研究需要一些自动的度量,以允许快速的开发和评估

如何做一个研究

  1. 定义任务,例如:Summarization(摘要)
  2. 定义数据集
    1. 寻找学术数据集
      它们已有baselines
      例如:Newsroom Summarization Dataset:https://summari.es/
    2. 定义自己的数据(更难一些,需要新的baselines)
      允许连接到自己的研究
      新的问题提供新的机会
      有创意:Twitter、博客、新闻等。有很多整洁的网站,为新的任务提供创造性的机会
  3. Dataset hygiene :分离 devtest 和 test,稍后会讨论更多
  4. 定义自己的度量
    在网上搜索在该任务上已有的度量方法
    摘要: Rouge (Recall-Oriented Understudy for GistingEvaluation) ,它定义了人工摘要的 n-gram重叠
    人工评价仍然更适合于摘要;你可以做一个小规模的人类计算
  5. 建立一个baseline
    首先实现一个最简单的模型(通常对unigrams、bigrams 或平均字向量进行逻辑回归)
    计算训练集和开发集的度量
    分析错误
    如果度量令人惊讶且没有错误,那么,完成!问题太简单了。需要重新找个任务
  6. 实现现有的神经网络模型
    计算训练集和开发集的指标
    分析输出和错误
    这门课的最低标准
  7. 永远要接近您的数据(除了最后的测试集),即要总是在当前数据集上进行实验,不能根据其他数据集去改进模型等等
    可视化数据集
    收集汇总统计信息
    查看错误
    分析不同的超参数如何影响性能
  8. 尝试一些不同的模型以及模型变体,旨在通过有一个好的实验设置快速迭代
    9.

Pots of data

  • 许多公开可用的数据集都是使用train/dev/test结构发布的。我们应该只在开发完成时才运行测试集
  • 这样的拆分以相当大的数据集为前提。
  • 如果没有dev集或者您想要一个单独的tune集,那么您可以通过分割训练数据来创建一个tune集,但你必须权衡它的大小/有用性与减少的train集大小
  • 有一个固定的测试集可以确保所有系统都是根据相同的gold数据进行评估的。这通常是好的,但是如果测试集具有不寻常的属性,从而扭曲了任务的进度,则会出现问题。

Training models and pots of data

  • 在训练时,可能会发生过拟合,即模型在训练集上表现很好,但在测试集上表现很差
  • 监测和避免过拟合的方法时使用独立的验证集(开发集)和测试集
    在这里插入图片描述
  • 在训练集上建立(估计/训练)模型。
  • 通常,然后在另一组独立的数据上设置更多的超参数,即调整集(tuning set ),调整集是超参数的训练集!
  • 当您在dev set(开发测试集或验证集)上运行时,您可以测量进度;如果您经常这样做,那么您就太适合dev集了,所以最好有第二个dev集,即dev2集
  • 只有在最后,你才能在一个测试集上评估和呈现最终的数字•使用最终的测试集极值几次…理想情况下只有一次
  • train、tune、dev和testset必须完全不同
  • 在训练集上测试是无效的,你会得到一个错误的好成绩。因为可能在训练集上发生过拟合
  • 您需要一个独立的验证集,如果验证集与训练集相同,则无法正确设置超参数
  • 我们需要意识到,每一次通过评估结果的变化而完成的调整,都是对数据集的拟合过程。我们需要对数据集的过拟合,但是不可以在独立测试集上过拟合,否则就失去了测试集的意义

Getting your neural network to train

  • 以积极的态度开始
  • 认识到残酷的现实
    • 有很多事情会导致神经网络不会学习或学习的不好,找到并修正它们(“debuggingandtuning”)可能会花费比实现模型更多的时间
  • 很难弄清楚这些东西是什么,但经验、实验护理和经验法则会有帮助!

Models are sensitive to learning rates
在这里插入图片描述
Models are sensitive to initialization
在这里插入图片描述
Training a (gated) RNN

  1. 使用LSTM或GRU:它使您的生活变得更加简单!
  2. 初始化递归矩阵为正交矩阵
  3. 用一个可感知的(小的)比例初始化其他矩阵
  4. 初始化忘记门偏差为1:默认记住
  5. 使用自适应学习速率算法:Adam, AdaDelta,…
  6. 梯度范数的裁剪:1-5似乎是一个合理的阈值,当与Adam 或 AdaDelta一起使用
  7. 要么只使用 dropout vertically,要么研究使用Bayesian dropout(Gal和Gahramani -不在PyTorch中原生支持)
  8. 要有耐心!优化需要时间

Experimental strategy

  • 增量地工作!
  • 从一个非常简单的模型开始
  • 一个接一个地添加修饰物让它开始工作,让模型使用它们中的每一个(或者放弃它们)
  • 最初运行在少量数据上
    • 你会更容易在一个小的数据集中看到bug
    • 像8个例子这样的东西很好
    • 通常,合成数据对这很有用
    • 确保你能得到100%的数据
      • 否则你的模型肯定要么不够强大,要么是破碎的
  • 在大型数据集中运行
    • 模型优化后的训练数据仍应接近100%
      • 否则,您可能想要考虑一种更强大的模式来过拟合训练数据
      • 对训练数据的过拟合在进行深度学习时并不可怕
        • 这些模型通常善于一般化,因为分布式表示共享统计强度,和对训练数据的过度拟合无关
  • 但是,现在仍然需要良好的泛化性能
    • 对模型进行正则化,直到它不与dev数据过拟合为止
    • 像L2正则化这样的策略是有用的
    • 但通常Dropout是成功的秘诀

Details matter!

  • 查看您的数据,收集汇总统计信息
  • 查看您的模型的输出,进行错误分析
  • 调优超参数对于神经网络几乎所有的成功都非常重要

报告要求
在这里插入图片描述

发布了29 篇原创文章 · 获赞 10 · 访问量 7163

猜你喜欢

转载自blog.csdn.net/weixin_42017042/article/details/104175085