CS224N(2.12)Convolutional Networks for NLP

今天我们介绍如何使用CNN解决NLP问题。截止目前,我们学习了很多RNN模型来解决NLP问题,由于NLP是序列的问题,使用RNN这种循环神经网络是很符合直觉的,而且也取得了不错的效果。但是,由于RNN速度较慢,而且梯度消失问题比较严重,人们就想借用CV领域的CNN,看是否能解决NLP的问题。 我们在之前的博客中已经详细介绍过卷积神经网络CNN,这里不再详细介绍。下面我们以一篇paper中使用CNN对句子进行情感分类为例,简要介绍下怎样将CNN应用到NLP中。 上图是一个非常简单的CNN网络,用来对影评进行情感分类,输入是一个长度为7的句子,我们把每个词用长度为5的词向量来表示,则对于输入来说,得到了一个7×5的矩阵,这不就相当于一张图片了吗,后续操作就很像CV了。第二步,需要对输入“图片“进行卷积操作,请注意,虽然输入可以看做图片,但其本质上是“一维”的句子,所以我们设计卷积核大小时,卷积核的宽度要固定为5,保证卷积核能对完整的词向量进行操作。这里共设计了3个不同大小的卷积核,每种大小有2个卷积核,共6个卷积核。卷积操作完成之后得到了6个特征图,对每个特征图取max pooling再拼接起来,得到一个长为6的向量,这就是用CNN对句子抽取的特征向量。最后再接一个softmax进行二分类。 除了上图展示的CNN操作外,还有一些CNN操作有可能会用到: 卷积操作的stride=k,每k行一个group进行卷积,默认卷积操作是k=1 卷积操作的dilation=k,跨k行进行卷积,默认卷积操作是k=1 padding,上图卷积操作之后,feature map相比于输入维度变小了,如果要想保持维度不变,可对输入进行padding max/avg pooling over time,上图的max pooling即为max pooling over time,即对整个句子所有时间步的feature取max k-max pooling,对整个句子的所有时间步的feature取top-k的max值,同时保持feature的相对顺序不变,上述max pooling相当于1-max pooling local max pooling,stride=k,对每k个feature取max,这个和CV里默认的max pooling是一样的,CV里就是画一个框取max dropout=p,对于每个连接,随机以概率p丢弃,属于一种正则化技术,能有效增加模型的鲁棒性 skip connections,之前讲过很多次了,直连线路,没有中间商赚差价 batch normalization,对每次卷积操作的输出进行z-score标准化,使得均值为0,标准差为1,能有效增加模型的鲁棒性 卷积核大小为1×1的卷积,相当于卷积前后的feature map的全连接,但又比全连接的参数少,因为一个卷积核的参数是共享的 最后,给出我们目前所学的工具箱: 词袋模型:对于一个句子,简单的把所有词的词向量进行平均,也能取得不错的baseline效果 基于滑动窗口的模型:对于POS、NER等不需要很长的上下文信息的问题来说,效果不错 CNN:对分类问题效果很好,容易在GPU上并行,所以效率很高 RNN:对于NLP问题来说,符合认知,对分类问题效果不是很好(如果只用最后一个隐状态的话),加上Attention性能提升明显,特别适合序列标注、语言模型等序列问题

August 5, 2019 · 1 min

CS224N(2.7)Question Answering

这节课的内容比较简单,是问答系统(Question Answering, QA)的入门介绍。 QA简介 首先,为什么需要QA?目前各大搜索引擎对于一个查询,给出的都是一个结果列表。但是很多查询是一个问题,答案也往往比较确定,比如“现任美国总统是谁?”,此时,返回一堆结果列表就显得太过啰嗦了,尤其是在手机等移动设备上搜索时,简单的给出回答也许会更好一些。另一方面,智能手机上的助手如Siri、Google Now之类的,用户期望的也是简洁的答案,而不是一堆网页列表。 QA系统的组成主要有两个部分,一部分是根据问题检索到相关的文档,这部分是传统的信息检索的内容;另一部分是对检索到的文档进行阅读理解,抽取出能回答问题的答案,这部分就是本文要介绍的QA系统。 QA的历史可追溯到上世纪七十年代,但真正取得突破性进展也就是最近几年。2015/2016年,几个大规模QA标注数据集的发表,极大的推动了这个领域的发展。这其中比较有名的数据集是斯坦福大学发布的Stanford Question Answering Dataset (SQuAD)。 SQuAD数据集的每一个样例包含一段描述P,一个问题Q,以及对Q的人工标注答案A。为了使数据集更加鲁棒,对于每个问题,都给出了三个人工标注答案。每个答案都是描述P中的一小段文字,称为一个span。所以,问题相对来说比较简单,答案可以直接从描述中提取sub-sequence得到。 QA系统的评价指标有两个,一个是确定性匹配Exact match,即对于每个问题,模型给出的回答如果和3个答案中的任意一个完全匹配,则加1分,否则不加分。另一个是F1指标,使用词袋模型(不考虑词的顺序),对于每个问题,模型给出的回答和3个答案中的每一个计算F1,这个问题的F1是3个F1的最大值,最终得分是所有问题的F1打分的均值。Exact match和F1都不考虑标点符号和冠词。相对来说,F1比Exact match更可靠和鲁棒一些。 经过两年的两三年的刷榜,SQuAD数据集的最好性能已经超越了人类的性能,为了增加数据集的难度,斯坦福后续推出升级版本SQuAD 2.0。 由于1.1版本的问题都有答案,所以QA系统变成了一个排序系统,只需要把Answer列表中排名第一的结果输出就好了。2.0在1.1的基础上,增加了没有答案的问题,可以理解为假问题,对系统造成干扰。此时就要求系统判断这个问题能否从描述P中获得答案,如果没有答案的话,就不输出任何回答<No Answer>。对于没有答案的问题,如果系统没有输出答案,得1分,否则输出任何答案都得0分。 SQuAD数据集的局限性: 回答都是span-based类型的,没有yes/no、计数、why等的问答。 由于构造问题q的时候,已知了描述P,那么q和P的描述会很像,无论是用词还是语法。而搜索引擎面临的真实情况往往是,q根本不知道P是什么,有可能q和P的描述在行文及用词上有很大差别。 描述P比较简单,因为答案是一个span,所以模型把q和P匹配,找到可能的答案位置就行。实际的复杂场景有可能要综合好几个句子的信息,还要理解不同的指代关系等才能得出最终答案。 虽然SQuAD数据集还有不少局限性,但由于其是一个well-targeted、well-structured、clean dataset,在QA发展初期,还是为促进QA发展立下了汗马功劳。 Stanford Attentive Reader 下面介绍一下Chris Manning组针对SQuAD数据集开发的QA系统——Stanford Attentive Reader。该系统目前虽然不是最好性能,但它包含QA的基本模块,可以作为QA的一个baseline模型。 首先模型对问题q进行表征的方法如下,输入是q中每个词的词向量,然后使用一个Bi-LSTM提取句子特征,由于是双向的LSTM,所以模型把正向和反向的LSTM的最后一个隐状态拼接起来,作为对整个句子的表征。 由于SQuAD数据集的回答都是描述P中的一个span,那么,模型只需要预测出这个span在P中的起始位置和终止位置即可,具体方法如下图所示。其实也很简单,上一步我们得到的句子的表征向量q,下一步,我们对描述P也使用Bi-LSTM,得到描述P中每个词的表征向量\(\tilde p_i\)。然后,使用两次Attention,用q查询集合\(P=[\tilde p_1,…,\tilde p_n]\),得到答案span的起始位置\(\alpha_i\)和终止位置\(\alpha’_i\)。另外,由于\(q\)和\(\tilde p_i\)的维度可能不一样,又或者为了提升模型性能,在计算Attention score的时候,不是简单的向量点积,而是采用了线性变换的方法,增加了参数\(W\)。 后来,Chris Manning组又推出了升级版本Stanford Attentive Reader++,主要包括两个方面。首先,对表征问题的网络进行了改进,\(q\)不仅包含Bi-LSTM的两个尾结点的隐状态,而是包含整个问题所有隐状态的加权平均,而且网络层数增加到了3层。其次,对描述P的表征方面,原来的输入只包含词向量,现在还包含语言特征(如POS、NER的标签)、词频、以及近义词的相似度等。改进版模型性能提升了不少。 另一个比较流行的QA系统是BiDAF,如下图所示,这里不再详细介绍。它的特点一方面输入不仅包含词向量,还包含字符级别的特征。另一大创新是在Attention Flow Layer,相对于Stanford Attentive Reader,BiDAF的Attention是双向的,不但包含q对P的Attention,还包含P对q的Attention。

August 4, 2019 · 1 min

CS224N(1.31)Translation, Seq2Seq, Attention

今天介绍另一个NLP任务——机器翻译,以及神经网络机器翻译模型seq2seq和一个改进技巧attention。 机器翻译最早可追溯至1950s,由于冷战的需要,美国开始研制由俄语到英语的翻译机器。当时的机器翻译很简单,就是自动从词典中把对应的词逐个翻译出来。 后来在1990s~2010s,统计机器翻译(Statistical Machine Translation, SMT)大行其道。假设源语言是法语\(x\),目标语言是英语\(y\),机器翻译的目标就是寻找\(y\),使得\(P(y|x)\)最大,也就是下图的公式。进一步,通过贝叶斯公式可拆分成两个概率的乘积:其中\(P(y)\)就是之前介绍过的语言模型,最简单的可以用n-gram的方法;\(P(x|y)\)是由目标语言到源语言的翻译模型。为什么要把\(P(y|x)\)的求解变成\(P(x|y)*P(y)\)?逐个击破的意思,\(P(x|y)\)专注于翻译模型,翻译好局部的短语或者单词;而\(P(y)\)就是之前学习的语言模型,用来学习整个句子\(y\)的概率,专注于翻译出来的句子从整体上看起来更加通顺、符合语法与逻辑。所以问题就转化为怎样求解\(P(x|y)\)。 SMT进一步把\(P(x|y)\)分解成\(P(x,a|y)\),其中\(a\)表示一个对齐alignment,可以认为是两种语言之间单词和单词或短语和短语的一个对齐关系。如下图所示是一个英语和法语的alignment。对齐本身就很复杂,存在1对1,1对多,多对1,多对多等情况,所以\(P(x,a|y)\)的求解在给定\(y\)的情况下,不但要考虑对齐方案\(a\)的情况\(P(a|y)\),还需要考虑对齐之后词与词的翻译情况\(P(x|a,y)\),可能的情况非常多。 那么,SMT怎样找到\(\arg max_y\)呢?穷举所有情况是不可能的,启发式搜索是可行的。形象描述就是在搜索过程中,对概率较低的路径进行剪枝,只保留概率较大的翻译情况。如下图的搜索树,对于概率较低的路径就不往下搜索了。 总之,统计机器翻译非常复杂,有很多的子模块,需要很多的人工干预和特征工程。 2014年,seq2seq模型横空出世,神经网络机器翻译(Neural Machine Translation, NMT)方兴未艾。seq2seq顾名思义,就是从序列到序列的模型,因为机器翻译的源语言和目标语言都是seq。 seq2seq的NMT如下图所示,它由两个RNN组成,左边的红色部分称为Encoder RNN,它负责对源语言进行编码(Encode);右边的绿色部分称为Decoder RNN,它负责对目标语言进行解码(Decode)。首先,Encoder RNN可以是任意一个RNN,比如朴素RNN、LSTM或者GRU。Encoder RNN负责对源语言进行编码,学习源语言的隐含特征。Encoder RNN的最后一个神经元的隐状态作为Decoder RNN的初始隐状态。Decoder RNN是一个条件语言模型,一方面它是一个语言模型,即用来生成目标语言的;另一方面,它的初始隐状态是基于Encoder RNN的输出,所以称Decoder RNN是条件语言模型。Decoder RNN在预测的时候,需要把上一个神经元的输出作为下一个神经元的输入,不断的预测下一个词,直到预测输出了结束标志符<END>,预测结束。Encoder RNN的输入是源语言的word embeding,Decoder RNN的输入是目标语言的word embeding。 seq2seq是一个很强大的模型,不但可以用来做机器翻译,还可以用来做很多NLP任务,比如自动摘要、对话系统等。 seq2seq作为一个条件语言模型,形式化来说,它直接对\(P(y|x)\)进行建模,在生成\(y\)的过程中,始终有\(x\)作为条件,正如下图的条件概率所示。 上面介绍了seq2seq的预测过程,seq2seq的训练过程如下图所示。训练的时候,我们同时需要源语言和翻译好的目标语言,分别作为Encoder RNN和Deocder RNN的输入。对于Encoder RNN没什么好说的。Decoder RNN在训练阶段,每一个时间步的输入是提供的正确翻译词,输出是预测的下一个时间步的词的概率分布,比如在\(t=4\),预测输出是\(\hat y_4\),而正确答案是“with”,根据交叉熵损失函数,\(J_4=-\log P(“with”)\)。总的损失函数就是所有时间步的损失均值。 seq2seq的训练过程是end2end的,即把Encoder RNN和Decoder RNN作为一个整体进行训练,不会像SMT一样有很多的子模块单独训练。当然seq2seq也可以单独对encoder和deconder进行训练优化,再组合,但是这个效果不一定会比整体优化encoder和deconder更好。 上上张图介绍的seq2seq的预测过程,实际上是一个贪心的预测过程,即在Decoder RNN的每一步都贪心选择\(\hat y_t\)概率最大的那个词。但是贪心只能保证每一步是最优的,无法保证预测出来的句子整体是最优的。特别是如果在\(t\)时刻贪心选择的词不是全局最优,会导致\(t\)时刻往后的所有预测词都是错误的,没有回头路了。但是如果每个时间步都穷举所有可能的情况的话,时间复杂度\(O(V^T)\)又太高了。 Beam search搜索策略是贪心策略和穷举策略的一个折中方案,它在预测的每一步,都保留Top-k高概率的词,作为下一个时间步的输入。k称为beam size,k越大,得到更好结果的可能性更大,但计算消耗也越大。请注意,这里的Top-k高概率不仅仅指当前时刻的\(\hat y_t\)的最高概率,而是截止目前这条路径上的累计概率之和,如下图的公式所示。 举例如下,假设\(k=2\),第一个时间步保留Top-2的词为”he”和”I”,他们分别作为下一个时间步的输入。”he”输入预测输出前两名是”hit”和”struck”,则”hit”这条路的累加概率是”he”的概率加上”hit”的概率=-1.7,类似的可以算出其他几个词对应路径的概率打分。最后在这4条路上保留\(k=2\)条路,所以”hit”和”was”对应路径保留,作为下一个时间步的输入;”struck”和”got”对应路径被剪枝。 最终的搜索树如下图所示,可以看到在每个时间步都只保留了\(k=2\)个节点往下继续搜索。最后”pie”对应的路径打分最高,通过回溯法得到概率最高的翻译句子。请注意,beam search作为一种剪枝策略,并不能保证得到全局最优解,但它能以较大的概率得到全局最优解,同时相比于穷举搜索极大的提高了搜索效率。 在beam search的过程中,不同路径预测输出结束标志符<END>的时间点可能不一样,有些路径可能提前结束了,称为完全路径,暂时把这些完全路径放一边,其他路径接着beam search。beam search的停止条件有很多种,可以设置一个最大的搜索时间步数,也可以设置收集到的最多的完全路径数。 当beam search结束时,需要从n条完全路径中选一个打分最高的路径作为最终结果。由于不同路径的长度不一样,而beam search打分是累加项,累加越多打分越低,所以需要用长度对打分进行归一化,如下图所示。那么,为什么不在beam search的过程中就直接用下面的归一化打分来比较呢?因为在树搜索的过程中,每一时刻比较的两条路径的长度是一样的,即分母是一样的,所以归一化打分和非归一化打分的大小关系是一样的,即在beam search的过程中就没必要对打分进行归一化了。 ...

August 2, 2019 · 1 min

CS224N(1.29)Vanishing Gradients, Fancy RNNs

梯度消失 今天介绍RNN的梯度消失问题以及为了解决这个问题引出的RNN变种,如LSTM何GRU。 在上一篇博客中,通过公式推导,我们已经解释了RNN为什么容易产生梯度消失或梯度爆炸的问题,核心问题就是RNN在不同时间步使用共享参数\(W\),导致\(t+n\)时刻的损失对\(t\)时刻的参数的偏导数存在\(W\)的指数形式,一旦\(W\)很小或很大就会导致梯度消失或梯度爆炸的问题。下图形象的显示了梯度消失的问题,即梯度不断反传,梯度不断变小(箭头不断变小)。 梯度消失会带来哪些问题呢?一个很明显的问题就是参数更新更多的受到临近词的影响,那些和当前时刻\(t\)较远的词对当前的参数更新影响很小。如下图所示,\(h^{(1)}\)对\(J^{(2)}(\theta)\)的影响就比对\(J^{(4)}(\theta)\)的影响大。久而久之,因为梯度消失,我们就不知道\(t\)时刻是真的对\(t+n\)时刻没影响还是因为梯度消失导致我们没学习到这种影响。 下图是一个更形象的例子,假设我们需要预测句子The writer of the books下一个单词,由于梯度消失,books对下一个词的影响比writer对下一个词的影响更大,导致模型错误的预测成了are,但这显然是不对的。 类似的,如果梯度爆炸,则根据梯度下降的更新公式,参数会一瞬间更新非常大,导致网络震荡,甚至出现Inf或NaN的情况。 梯度爆炸一个比较好的解决方法是梯度裁剪,即如果发现梯度的范数大于某个阈值,则以一定的比例缩小梯度的范数,但不改变其方向。如下下图所示,左子图是没有梯度裁剪的情况,由于RNN的梯度爆炸问题,导致快接近局部极小值时,梯度很大,参数突然爬上悬崖,然后又飞到右边一个随机的区域,miss掉了中间的局部极小值。右子图是增加了梯度裁剪之后,更新步伐变小,参数稳定在局部极小值附近。 总的来说,梯度爆炸相对好解决,但梯度消失就没那么简单了。在RNN中,每个时刻\(t\),都改写了前一个时刻的隐状态,而由于梯度消失问题,长距离以前的状态对当前时刻的影响又很小,所以导致无法建模长距离依赖关系。那么,如果把每个时刻的状态单独保存起来,是否能解决长距离依赖问题呢? LSTM LSTM就是这样一个思路,请大家结合如下两幅图来理解: (下图)首先,从宏观上来说,LSTM的隐层神经元不仅包含隐状态\(h_t\),还专门开辟了一个cell来保存过去的“记忆”\(c_t\),LSTM希望用\(c_t\)来传递很久以前的信息,以达到长距离依赖的目的。所以LSTM隐层神经元的输入是上一时刻的隐状态\(h_{t-1}\)和记忆\(c_{t-1}\),输出是当前时刻的隐状态\(h_t\)和希望传递给下一个时刻的记忆\(c_t\)。 (上图)每个时刻\(t\),为了调控遗忘哪些记忆,写入哪些新记忆,LSTM设置了两个门,分别是遗忘门\(f^{(t)}\)和写入门\(i^{(t)}\)。它们都是上一时刻的隐状态\(h^{(t-1)}\)和当前时刻的输入\(x^{(t)}\)的函数。\(f^{(t)}\)控制遗忘哪些记忆,即\(f^{(t)}\circ c^{(t-1)}\);\(i^{(t)}\)控制写入哪些新记忆,即\(i^{(t)}\circ \tilde c^{(t)}\),其中\(\tilde c^{(t)}\)即为期望写入的新记忆,它也是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。最终,新时刻\(t\)的记忆就是这两部分的组合,请看上图\(c^{(t)}\)表达式。 (上图)输出门\(o^{(t)}\)控制哪些记忆需要输出到下一个隐状态\(h^{(t)}\),\(o^{(t)}\)自己又是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。 大家结合上图的公式和下图的示意图就不难理解了。 LSTM解决梯度消失最直接的方法就是,遗忘门选择不遗忘,每一时刻的\(f^{(t)}\)都选择记住前一时刻的记忆\(c^{(t-1)}\),然后直接传递给下一时刻。那么,所有前\(t-1\)时刻的记忆都会被完整的传递给第\(t\)时刻,从而对\(t\)时刻的输出产生影响。 而朴素RNN无法保存前期状态的原因就是因为朴素RNN把之前时间步的信息都一股脑存储在隐状态\(h^{(t)}\)中了,隐状态\(h^{(t)}\)成为了整个网络的瓶颈,一旦出现梯度消失,则很久以前的信息对当前时刻的影响就微乎其微了。LSTM的关键就是开辟了一个新的cell来存储记忆,这个新的cell相当于记忆的一条捷径,时刻\(t\)除了可以像常规RNN一样通过\(h^{(t-1)}\)来获取很久以前的信息,还可以通过cell存储的记忆\(c^{(t-1)}\)来便捷地获取到很久以前的信息,所以隐状态\(h^{(t)}\)不再成为整个网络的瓶颈,有新的cell来分担。 需要提醒的是,虽然LSTM开辟新的cell来存储记忆,但这个记忆也会受到连续梯度相乘的影响,所以依然存在梯度消失或梯度爆炸的问题,但从实际效果来看,LSTM性能很不错,也很鲁棒。 GRU 另一种能缓解RNN梯度消失的网络——GRU。为了简化LSTM,GRU又没有cell了,但依然保留了门来控制信息的传递。首先看下图最后一个公式,当前时刻的隐状态\(h^{(t)}\)等于上一时刻的隐状态\(h^{(t-1)}\)和新写入的隐状态\(\tilde h^{(t)}\)的加权平均,通过更新门\(u^{(t)}\)来控制它们之间的比例,\(u^{(t)}\)是上一时刻的隐状态\(h^{(t-1)}\)和当前时刻的输入\(x^{(t)}\)的函数。新写入的隐状态\(\tilde h^{(t)}\)又通过一个重置门\(r^{(t)}\)来控制,类似的,\(r^{(t)}\)也是\(h^{(t-1)}\)和\(x^{(t)}\)的函数。 个人觉得,GRU中的更新门\(u^{(t)}\)类似于LSTM中的输出门\(o^{(t)}\);GRU中的重置门\(r^{(t)}\)类似于LSTM中的遗忘门\(f^{(t)}\)和写入门\(i^{(t)}\)的组合;GRU中新写入的隐状态\(\tilde h^{(t)}\)类似于LSTM中的细胞记忆\(c^{(t)}\)。所以,可以把GRU看作LSTM的简化版本。 直观来说,GRU和LSTM类似,解决梯度消失的策略就是新增\(u^{(t)}\)来控制\(h^{(t-1)}\)和\(\tilde h^{(t)}\)的比例,如果\(u^{(t)}=0\),则\(h^{(t)}=h^{(t-1)}\),即\(t\)时刻的隐状态和上一时刻的隐状态相同,虽然这肯定效果不好,但至少说明GRU是有能力保留之前的隐状态的。 GRU和LSTM的性能差不多,但GRU参数更少,更简单,所以训练效率更高。但是,如果数据的依赖特别长且数据量很大的话,LSTM的效果可能会稍微好一点,毕竟参数量更多。所以默认推荐使用LSTM。 其他缓解梯度消失的策略 由于链式法则,或者所选非线性激活函数的原因,不仅仅RNN,所有神经网络都存在梯度消失或者梯度爆炸的问题,比如全连接网络和CNN。一些通用解决方法如下: ResNet。因为梯度是在传递的过程中逐渐减小并消失的,如果跨越好几层直接进行连接,天然能保持远距离信息。个人理解,这就相当于买家和卖家直接相连,没有中间商赚差价\(\mathcal F(x)\),买到的价格最接近卖出的价格\(x\)。能一定程度上减弱梯度消失的问题。 更激进的是DenseNet,把跨越多层之间的很多神经元都连起来,也就是说有更多的线路没有中间商赚差价,进一步减弱梯度消失问题。 HighwayNet。借鉴了LSTM和GRU的思路,不是像ResNet一样直接新增一条直连线路\(x\),而是搞一个平衡因子\(u\),卖家到买家的价格由\(u\)进行调和平均:\(u*\mathcal F(x)+(1-u)*x\),用\(u\)来控制多少走中间商,多少走直连线路。 虽然所有神经网络都存在梯度消失的问题,但RNN的这个问题更严重,因为它连乘的是相同的权重矩阵W,而且RNN针对的是序列问题,往往更深。 双向RNN 假设我们在对句子进行情感分类,如下图所示。对于terribly这个词,常规RNN,terribly的梯度只能看到左边的信息,看不到右边的信息,因为网络是从左到右的。单独看terribly或者从左往右看,在没有看到exciting时,可能认为terribly是贬义词,但是如果跟右边的exciting结合的话,则意思变为强烈的褒义词,所以有必要同时考虑左边和右边的信息。 双向RNN包含两个RNN,一个从左往右,一个从右往左,两个RNN的参数是独立的。最后把两个RNN的输出拼接起来作为整体输出。那么,对于terribly这个词,它的梯度能同时看到左边和右边的信息。 由于双向RNN对于某个时刻\(t\),既需要知道\(t\)时刻前的信息(Forward RNN),又需要知道\(t\)时刻之后的信息(Backward RNN),所以双向RNN无法用于学习语言模型,因为语言模型只知道时刻\(t\)之前的信息,下一时刻的词需要模型来预测。对于包含完整序列的NLP问题,双向RNN应该是默认选择,它通常比单向RNN效果更好。 多层RNN 前面展示的RNN从时间\(t\)的维度上来说可以认为是多层的,但是RNN还可以从另一个维度来增加层数。如下图所示,将上一层(RNN layer 1)的输出作为下一层(RNN layer 2)的输入,不断堆叠下去,变成一个多层RNN。通常来说,深度越大,性能越好,如果梯度下降能训练好的话。 RNN的层数通常不会很深,不会像CNN一样,达到上百层,RNN通常2层,最多也就8层。一方面是RNN的梯度消失问题比较严重,另一方面是RNN训练的时候是串行的,不易并行化,导致网络太深的话训练很花时间。 ...

August 1, 2019 · 1 min

CS224N(1.24)Language Models and RNNs

今天要介绍一个新的NLP任务——语言模型(Language Modeling, LM),以及用来训练语言模型的一类新的神经网络——循环神经网络(Recurrent Neural Networks, RNNs)。 语言模型就是预测一个句子中下一个词的概率分布。如下图所示,假设给定一个句子前缀是the students opened their,语言模型预测这个句子片段下一个词是books、laptops、exams、minds或者其他任意一个词的概率。形式化表示就是计算概率 $$\begin{eqnarray}P(x^{(t+1)}|x^{(t)},…,x^{(1)})\tag{1}\end{eqnarray}$$\(x^{(t+1)}\)表示第\(t+1\)个位置(时刻)的词是\(x\),\(x\)可以是词典\(V\)中的任意一个词。 既然语言模型在给定前t个词之后可以预测第t+1个词的概率,那么预测到第t+1个词之后,又可以递归的根据前t+1个词预测第t+2个词,如此不断的进行下去,就可以预测一整个句子的概率了。所以,也可以把语言模型看做一个可以计算一个句子出现的概率的系统,形式化表示就是如果一个句子是\(x^{(1)},…,x^{(T)}\) ,那么语言模型可以计算句子概率 $$\begin{eqnarray}P(x^{(1)},…,x^{(T)})& = & P(x^{(1)})\times P(x^{(2)}|x^{(1)})\times…\times P(x^{(T)}|x^{(T-1)},…,x^{(1)}) \tag{2}\\& = & \prod_{t=1}^T P(x^{(t)}|x^{(t-1)},…,x^{(1)})\tag{3}\end{eqnarray}$$可以看到(3)式连乘的项就是(1)式,所以这两个定义的内涵是一样的。 那么语言模型有什么用呢?它的用处可大了,比如现在的输入法会根据前一个输入的词预测下一个将要输入的词,此所谓智能输入法;比如在百度或谷歌搜索时,输入前几个关键词,搜索引擎会自动预测接下来可能的几个词;比如网上有很多智能AI会自动生成新闻、诗歌;还比如用在语音识别、机器翻译、问答系统等等。可以说语言模型是很多NLP任务的基础模块,具有非常重要的作用。 在前-深度学习时代,人们使用n-gram方法来学习语言模型。对于一个句子,n-gram表示句子中连续的n个词,比如还是上图的例子,n-gram对于n=1,2,3,4的结果是: 1-grams (unigrams): “the”, “students”, “opened”, “their” 2-grams (bigrams): “the students”, “students opened”, “opened their” 3-grams (trigrams): “the students opened”, “students opened their” 4-grams: “the students opened their” n-gram方法有一个前提假设,即假设每个词出现的概率只和前n-1个词有关,比如2-gram对于每个词出现的概率只和前面一个词有关,和更前面的词以及后面的词都没有关系,所以我们有如下图的assumption。又这是一个条件概率,展开之后得到如下除法的形式。n-gram的计算方法就是,统计语料库中出现\(x^{(t)},…,x^{(t-n+2)}\)的次数(分母),以及在这个基础上再接一个词\(x^{(t+1)}\)的次数\(x^{(t+1)},x^{(t)},…,x^{(t-n+2)}\)(分子),用后者除以前者来近视这个条件概率。 举个例子,假设完整的句子是as the proctor started the clock, the students opened their,需要预测下一个词的概率分布。对于4-gram方法,则只有students opened their对下一个词有影响,前面的词都没有影响。然后我们统计训练集语料库中发现,分母students opened their出现1000次,其后接books即students opened their books出现了400次,所以P(books|students opened their)=400/1000=0.4。类似的,可以算出下一个词为exams的概率是0.1。所以4-gram方法认为下一个词是books的概率更大。 ...

July 31, 2019 · 2 min

CS224N(1.22)Dependency Parsing

Dependency Parsing是指对句子进行语法分析并画出句子成分的依赖关系,比如对于句子“She saw the video lecture”,首先可以分析出主语、谓语、宾语等句子成分;其次可以分析出依赖关系,比如saw依赖于She等。这就是句法分析。完成句法分析的算法被称为句法分析器parser,一个parser的性能可以用UAS和LAS来衡量,UAS就是parse出来的依赖关系对比正确依赖关系的正确率,LAS就是句子成分分析的正确率。 那么,为什么需要句法分析呢?因为:(i)了解句子结构能更好的理解句子的含义;(ii)人们在交流的时候,通过组合简单的句子成分来表达复杂的含义;(iii)我们需要知道句子中成分之间的依赖关系,以此来正确解读句子的含义。 其实说到底就是为了更正确的理解句子含义。比如对于句子“San Jose cops kill man with knife”这个句子就有歧义,with knife到底是修饰man还是修饰kill,句子的意思大不相同。如果新闻小编学过NLP的话,大概不会写出这种歧义的句子。 句法分析有很多算法,本世纪初当机器学习兴起后,Nivre等人提出了基于转移的句法分析器。该算法维护一个堆栈stack,用来存放已经分析过的词,以及一个buffer,用来存放还未分析的词。初始时,stack只有一个额外添加的[root]节点,buffer保存了完整的句子。然后,对于buffer中的每一个词,有三种操作,分别是:(i)shift,将buffer中的一个词压入stack;(ii)left arc,对于stack中的词,如果栈的第二个元素是栈顶元素的依赖项,则把第二个元素出栈;(iii)right arc,对于stack中的词,如果栈顶元素是栈的第二个元素的依赖项,则把栈顶元素出栈。如此循环,直到buffer为空以及stack中只剩下[root]。 对于上述算法,核心问题是,对于stack+buffer的不同状态,应该选择shift、left arc和right arc中的哪个操作呢?对于本世纪初的研究者来说,他们选择了机器学习方法。很简单嘛,每一个stack+buffer的状态相当于输入,3种操作相当于输出,把这个问题建模成分类问题不就行了吗。于是Nivre等人对每一个stack+buffer的状态,人工抽取出很多的特征,然后使用logistic或者svm进行分类。但是,当时的特征设计都是0/1状态的,特征向量很稀疏;特征又多,抽取特征很花时间。 当神经网络火了之后,人们自然想到了用神经网络替代logistic或svm,提出了新的句法分析器,该课程老师所在团队就是这么干的。他们对于每一个stack+buffer的状态,抽取出words、POS tags和arc labels三种不同类型的特征,都用词向量来表示。然后输入只有一个隐层的全连接网络,效果立马超过了之前所有人工设计的特征和方法。基于这个工作,后续又有很多改进版本。 https://nlp.stanford.edu/pubs/emnlp2014-depparser.pdf 好了,上述就是这节课的主要内容,由于本人对句法分析不太感兴趣,没有亲自做作业,大家可以参考别人的解答。

July 29, 2019 · 1 min

CS224N(1.15 & 1.17)Backpropagation

这篇博客把1.15和1.17两次课内容合并到一起,因为两次课的内容都是BP及公式推导,和之前的Neural Networks and Deep Learning(二)BP网络内容基本相同,这里不再赘述。下面主要列一些需要注意的知识点。 使用神经网络进行表示学习,不用输入的x直接预测输出,而是加一个中间层(图中橙色神经元),让中间层对输入层做一定的变换,然后中间层负责预测输出是什么。那么中间层能学到输入层的特征,相当于表示学习,自动学习特征。对于word2vec,中间层就是词向量。 命名实体识别(Named Entity Recognition, NER),任务是把一个句子中的一些实体词识别出来,比如下图中识别出地点LOC、机构ORG和人名PER等。通常采用的方法是把需要判断类型的词及其周围的几个词的词向量拼接起来,输入到神经网络进行分类。但是由于一个句子中真正的实体词较少,而很多其他词Others会很多,导致样本不均衡,此时需要进行采样,具体方法可以搜索怎样处理NER样本不均衡的问题。 我们知道词向量其实是NLP实际任务中的副产品,任何一个NLP任务都可以得到词向量。这就存在一个问题,当我们在实现一个具体的NLP任务时,是使用预训练的词向量,还是根据实际任务现场训练一个词向量呢?建议是,如果有可用的预训练词向量,则最好使用预训练词向量。因为预训练的词向量通常在很大规模的数据集上进行过训练,词向量的质量还不错,而某个具体的NLP任务的样本数可能不太多,导致训练得到的词向量还没人家预训练的好。所以,如果实际任务的数据量较小,则用预训练的词向量;否则,可以尝试一下根据实际任务fine tune词向量。 这节课的核心就是不断使用链式法则对BP算法求导,然后反向传播。在反向传播的过程中,可以利用上游计算好的梯度,增量式的更新下游的梯度,如下图所示,就是公式[downstream gradient] = [upstream gradient] × [local gradient]。这个在之前介绍BP网络的时候也提到过,其实就是那篇博客的(BP2)公式,误差对\(w\)的偏导可以通过误差对\(b\)的偏导乘以神经元输出得到。 当有多个输入的时候,也是一样,只不过local gradients变为了多个分支。 很有意思的是老师总结到:加法相当于把上游的梯度分发给下游;max相当于路由;乘法相当于开关。听老师讲下面的实例会有切身的体会。 当然,现在的流行的神经网络框架都帮我们完成了自动求导,我们只需要把local gradient定义好,框架会自动帮我们进行反向传播。需要定义的就两点,一个是正向经过该神经元,output=forward(intput);另一个是反向经过该神经元时,input_gradient=backward(output_gradient)。下面第二个图是一个很简单的例子,定义了forward和backward两个操作。 最后,简要介绍了6个注意事项: 使用正则化避免过拟合 使用python的向量和矩阵运行,而不是for循环,前者相比于后者有~10x加速 目前流行的非线性激活函数是ReLU,Sigmoid和tanh比较少用了 参数(权重)初始化,初始值最好是随机的很小的值,有一些专门的策略,如Xavier sgd优化器效果还不错,不过目前流行的优化器是Adam 学习率最好是10的倍数,而且可以成10倍的放大或缩小;一些fancy的优化器会对设定的学习率进行逐步缩减(比如Adam),所以对于这些优化器,一开始的学习率可以设大一点,比如0.1 最后是本周作业,包含两部分内容,一部分是手动求导,编辑公式太麻烦了,我就写在了纸上,大家可以参考这位仁兄的解答。另一部分是根据手动推导的梯度公式,补充word2vec算法中的求解梯度的算法以及sgd更新公式,如果是第一次接触这方面内容,可以参考这位仁兄的实现。 但是,根据上一篇博客的介绍,word2vec除了可以根据作业中的极大似然的方法求解,还可以用3层全连接网络来实现,相比于极大似然更简洁也更容易理解,具体可以参考这篇博客以及这篇具体实现。

July 29, 2019 · 1 min

《三国演义》人物命运走向

董卓 东汉末年,十常侍专权,外戚何进为了除掉十常侍,引西凉军董卓入宫。董卓入宫后,为彰显威严,招安吕布,废刘辩立刘协,杀害刘辩和何太后。由于董卓在朝廷专横跋扈,士大夫群情激奋,组成了一个十八路诸侯联盟,盟主是袁绍,准备讨伐董卓。董卓带着吕布出战,最后失败。 失败之后,董卓焚烧洛阳的宫殿,迁都长安。后司徒王允用自己府上的歌伎貂蝉,巧使连环计,先说把貂蝉许配给吕布,后又送给董卓,由此挑拨离间董卓和吕布的关系。后来,董卓发现吕布和貂蝉在凤仪亭搂搂抱抱,董卓大闹凤仪亭,自此董卓和吕布结怨。貂蝉于是劝董卓搬家,于是他们搬家到郿坞。后来有一天,王允和吕布假借汉献帝召集文武百官进宫吃饭,董卓欣然进宫,被早就埋伏在此的王允、吕布等人杀害。 董卓死后,董卓手下四员大将李傕、郭汜、张济、樊稠在西凉起兵,进攻长安,烧杀抢掠,把王允也杀了,国家大权落到了李傕和郭汜手中。后太尉杨彪使用反间计,离间李傕和郭汜。于是,李傕和郭汜之间爆发战斗,李傕劫了天子,郭汜劫了文武百官,每日厮杀。后来张济讲和,李傕卖个人情,开始移驾弘农。在路上遇到杨奉董承双救驾,劫驾成功。败走的李傕后来又和郭汜合兵一处,开始反击。后杨彪引曹操入宫护驾,曹操大喜,进宫后干翻了李傕和郭汜。自此董卓基团覆灭。 吕布 吕布被称为三姓家奴,就是因为吕布不断改认干爹,反复无常,不忠不义。首先,吕布是汉臣丁原的干儿子,在董卓入宫想要废辩立协的时候,丁原不同意,这个时候吕布还站在他爹丁原这边。没想到第二天吕布就被董卓收买了,不但投靠到董卓麾下,临走之前还把丁原杀了,真是忘恩负义。 在董卓手下也没干多久,就因为貂蝉的事情,和王允合作,把董卓杀了,第二次杀了自己的主子。后来,董卓手下李傕和郭汜反攻长安,吕布败走。从宫中逃出来的吕布攻陷了曹操的老巢兖州和濮阳,后又被曹操夺回。于是,吕布转投徐州刘备,刘备好心将吕布安顿在小沛这个地方。没想到,在刘备外出期间,张飞和吕布这两个暴脾气,起冲突了,吕布一举拿下了徐州。刘备回来之后,吕布把刘备安排在小沛,相当于吕布和刘备的位置互换。 有一天,吕布发现小沛的刘备不安分,要联合曹操密谋自己。于是吕布围攻小沛,刘关张看形势危急,弃小沛,逃难到曹操手下。同时,曹操率领大军进攻徐州,在徐州的下邳城,擒拿吕布,并枭首。一代枭雄吕布,就此殒命。 三姓:指的吕布本姓吕,为丁原义子也可姓丁,做董卓义子又可姓董。故此有三姓。 袁绍 袁绍,四世三公,算是朝廷中很有威望的家族,但一手好牌被打得稀烂。首先,在十八路诸侯组成联盟准备讨伐董卓时,大家公认推举袁绍当盟主,统领诸侯。但是,袁绍调度大军的能力不够,在诸侯之间产生矛盾时,也处理不当,比如孙坚私藏传国玉玺之后,袁绍大怒,让刘表截住孙坚,由此导致刘表和孙坚结怨。而且袁绍很自私,比如在约好了和公孙瓒一起进攻冀州,事成之后平分冀州,但袁绍成功之后却独占冀州。总之呢,在前期,袁绍没能很好的利用自己作为诸侯盟主的领导位置,凝聚力不够,最后这个联盟也不了了之。 在诸侯割据时期,袁绍毕竟四世三公,在北方的根据地还是很稳固的。但曹操毕竟挟天子以令诸侯,袁绍要想继续维持甚至扩大自己的势力范围,和同在中北部的曹操必将有一场恶战。在曹操出兵攻打刘备期间,袁绍本来有一个很好的机会,可以乘机袭击曹操老巢许都,但袁绍却因自己最爱的小儿子生病为由,没心思打仗不打算出兵。后来,在曹操大破刘备,甚至都招安了关羽之后,袁绍想起来要和曹操正面对抗。于是带着颜良文丑进攻白马,而曹操正好利用关羽,轻松干掉了袁绍最重要的两元大将颜良和文丑。而在这期间,袁绍还收留着刘备,并听信了刘备的解释。 再后来,袁绍依然仗着自己军事实力雄厚,继续进攻曹操。在官渡之战中,由于不体恤部下,导致谋士和大将接连倒戈,其中就有很重要的一个人物许攸。许攸倒戈到曹操那边之后,献计火烧乌巢。最终,曹操以少胜多,大获全胜。 官渡之战之后,袁绍一蹶不振,后来旧病复发,吐血斗升而死。袁绍临死之前,又做了一个不正确的决定,废长立幼,导致袁绍的这些儿子们,爆发了争夺继承权的战争。曹操采用逐个击破的战术,先后剿灭了袁绍儿子们的势力,至此,袁绍基团覆灭,曹操占领北方。 袁术 袁术是袁绍的弟弟,势力范围在淮南一带,在诸侯割据期间,势力也不算小。孙策自从父亲被杀之后,就投奔袁术了。有一天,孙策想重振父业,东征刘繇,于是向袁术借兵,并把孙坚留下来的传国玉玺压在了袁术那里,等事成之后再来取。没想到当孙策在江东站稳脚跟,向袁术要回自己的玉玺时,袁术居然耍赖不给。 再后来,袁术仗着自己在淮南地广粮多,又有传国玉玺,居然就称帝了。。。是三国历史上第一个称帝的诸侯。但是因为袁术骄奢过度,不恤军民,众皆背反,袁术也觉得自己可能镇不住帝王称号,想放弃淮南,去投奔兄长袁绍,并且相约把帝号和玉玺给袁绍。刘备听说这个消息之后,想借截留袁术之名,脱离曹操,曹操同意。于是,袁术在北上的路上,和刘备在徐州相遇,两军大战,袁术败,吐血斗余而死。袁术本来是三国势力中比较大的一支,兵粮足备,又有传国玉玺,算是第一个称帝的势力,居然落到这个下场,真是凄惨啊。 魏晋 曹操出生于宦官家庭,养祖父是宦官曹腾,父亲曹嵩是曹腾的养子。有史书记载曹嵩又是夏侯氏的儿子,所以曹操和夏侯家族是亲戚。 曹操在《三国演义》中第一次出现是为了谋杀奸臣董卓,偷偷藏了一把刀靠近董卓,想要暗杀董卓,但董卓刚好从衣镜中发现了举着刀的曹操。逃出宫的曹操被董卓通缉,被逼无奈,只好发布公告,招兵买马,准备讨伐董卓,由此才有了后来的十八路诸侯联盟。后来,曹操在兖州稳定下来。在董卓被杀,李傕郭汜反目成仇之际,杨奉董承救驾成功之后,杨彪邀请曹操入宫护驾。这给了曹操一个天载难逢的机会,从此,曹操移驾许都,挟天子以令诸侯,开始了他的腾飞大业。 曹操掌权之后,第一战就是讨伐张绣、张济,本来张绣都已经投降了,但曹操把人家张济老婆睡了,导致张绣、张济大怒,密谋暗算曹操。虽然曹操侥幸逃脱,但长子曹昂、爱将典韦被杀,损失惨重。后来曹操缓过神来,反败为胜,大败张绣张济。后来,曹操又打败袁术、吕布,获得传国玉玺。于是曹操在朝廷中更加专横跋扈,甚至不把皇帝放在眼里。皇帝的衣带诏被曹操识破,曹操灭了董承、董贵妃、还有很多想要谋杀曹操的人。由于刘备也在衣带诏上签名了,而且刘备煮酒论英雄之后脱离曹操,曹操一直记恨刘备。于是起兵攻打刘备,俘虏关羽。在曹操和袁绍的战争中,曹操利用关羽,杀了袁绍两员大将颜良文丑,后来关羽得知刘备下落后就离开了曹操。 慢慢的,曹操在灭了中原及北方的弱小集团后,威胁到袁绍的地位。袁绍主动出击,进攻曹操。曹操在众谋士荀彧、荀攸、许攸的指导下,成功以弱胜强,打赢了官渡之战,并随后消灭了袁绍及其几个儿子的势力,夺得北方的霸主地位。但是,曹操的目标是星辰大海,仅仅是北方一霸还满足不了曹操的欲望,曹操开始南下攻打刘备。刘备联合孙权,与曹操爆发了著名的赤壁之战。赤壁之战不能说曹操太弱了,只能说吴蜀联合起来太强了,曹操轻信庞统铁索连战船的阴谋,被诸葛亮借的东风和周瑜的大火给打败了,损失惨重。曹操败走华容道,幸好遇到了重情义的关羽,放了曹操一马,要不然曹操就over了。赤壁一战,曹操惨败,逃回许都休养生息。 年复一年,刘备的势力越来越大,曹操还是坐不住了,打算再次南下攻打刘备,但又担心西凉军马腾乘虚而入,于是假借圣旨,召马腾入宫,然后灭了马腾。马腾儿子马超不干了,起兵和曹操大战,曹操大败,割须弃袍,差点被杀。后来,曹操使用反间计,最后还是打败了马超,马超败逃。再后来,曹操南下占领汉中,后又被诸葛亮夺去。曹操生气,联合孙吴,派大军攻打刘备。蜀国关羽,在魏国和吴国的联合进攻下,败走麦城,最终被杀。却说曹操看到关羽首级后,心神不宁,老做噩梦,身体每况愈下,没过多久就病死了。曹操长子曹丕继位。 曹丕继位之后,为了防止兄弟争夺王位,把几个兄弟都铲除了,包括曹植、曹熊等。而且,没过多久,曹丕逼汉献帝退位,开始称帝,国号大魏。曹丕在位仅7年,病故,幼子曹睿继位。诸葛亮想趁魏国国内新旧交替,政局不稳,进攻魏国。此时,司马懿崭露头角,和诸葛亮在谋略上势均力敌,破了诸葛亮的六出祁山,诸葛亮在五丈原病死。诸葛亮死后几年,魏蜀吴相安无事。魏主曹睿开始骄奢淫逸,做出各种昏庸残暴的事情。不过,曹睿也命短,在位13年就驾崩了,皇位传给儿子曹芳,由曹爽和司马懿辅政。由于曹芳年龄很小,政权基本在曹爽和司马懿手中,曹爽和司马懿的关系不好,司马懿就装疯卖傻,让曹爽不再提防自己。司马懿骗过曹爽,果然不再对司马懿设防。但就在曹爽和曹芳出城狩猎之际,司马懿看准机会,起兵反叛,夺取京城,灭门曹爽,从此魏国权力落到了司马懿手中。 司马懿虽然熬死了曹操、曹丕、曹睿,算命长的了,但也有死的一天。司马懿病故之后,两个儿子司马师和司马昭子承父业。司马师蛮横无理,目中无人,魏主曹芳忍无可忍,也写衣带诏想让人除掉司马师,但事情败露,司马师废了曹芳,另立曹髦,历史总是惊人的相似。 后来,司马师在与曹家亲信的对战中,患了眼疾,脑子坏掉死了,魏国大权落到了弟弟司马昭手中。司马昭之心路人皆知,大家都知道司马昭肯定要篡位,魏主曹髦也不例外,于是非常悲壮的一幕出现了,曹髦带着几百个官僮,手无寸铁,和司马昭的军队血拼,最终曹髦被杀。司马昭还假惺惺的问怎么回事,但还不好意思称帝,又立了一个傀儡皇帝曹操的孙子曹奂。 在这期间,蜀国后主刘禅昏庸无道,司马昭派出大军,进攻蜀国,最终,蜀国灭亡。后来,司马昭中风死了,立长子司马炎为太子。司马炎继位,废除魏主曹奂,称帝。自此魏国灭亡,晋国开始。再后来,司马炎灭掉吴国,三家归晋。 蜀国 刘备、关羽、张飞桃园三结义,从镇压黄巾起义开始,走上了复兴汉室的道路。刘备镇压黄巾起义之后,得到了小小的县令官,但因为张飞怒鞭督邮,丢了县令官。后经过公孙瓒推荐,守平原县令。后来,在十八路诸侯讨伐董卓的战斗中,关羽温酒斩华雄,名震一时。 后来,徐州陶谦被曹操围攻,陶谦向北海孔融求解,但孔融又正好被黄巾余党围攻,于是孔融又向刘备求解。刘备向公孙瓒借了赵云,救了孔融和陶谦。陶谦感恩戴德,想把徐州送给刘备,刘备再三推辞,最后还是在陶谦要死的时候,接手了徐州,有了自己的根据地。后来,吕布被曹操追杀,走投无路,投奔徐州刘备,刘备安排吕布住小沛。吕布在刘备外出的时候,和张飞起了冲突,吕布夺取徐州,等刘备回来后,吕布安排刘备住小沛,相当于吕布和刘备位置互换。但是刘备也不是等闲之辈,在小沛招兵买马,张飞还抢吕布手下的马匹,吕布大怒,攻打刘备。刘备没办法,投奔曹操。 在曹操帐下时,曹操和刘备煮酒论英雄。刘备借阻击袁术之由,摆脱曹操,同时灭掉了袁术,重新占领了徐州。曹操因为刘备在衣带诏上签字,又夺去了徐州,很生气,围攻徐州。刘关张三人被打散,刘备投奔袁绍,关羽归顺曹操,张飞被迫去了芒砀山。后来,在曹操和袁绍的战斗中,关羽帮曹操杀了颜良文丑,解了曹操的白马之围,在得知刘备在袁绍帐中之后,离开曹操。最后,刘关张再次会师,还遇到了无处可走的赵云,几个人投奔了荆州刘表,刘表安排他们在新野。 在新野,刘备遇到了他一生中最重要的人诸葛亮,经过三顾茅庐,诸葛亮加盟刘备集团,从此刘备集团开始腾飞。此时,羽翼逐渐丰满的刘备,遭到曹操的进攻。诸葛亮火烧新野、刘玄德携民渡江、赵子龙单骑救主、张翼德大闹长坂桥等。最后,退无可退,诸葛亮凭借三寸不烂之舌,联合孙吴,共抗曹操。在赤壁之战中,打败曹操,占领荆州(实际上是从孙权手中窃取了胜利果实),有了自己的根据地。周瑜和孙权想要回荆州,但刘备和诸葛亮硬是不给。周瑜想了好多鬼点子,最后都失败了,而且是赔了夫人又折兵,把孙权的妹妹嫁给了刘备。 后来,庞统加盟刘备集团,刘备集齐了卧龙、凤雏两大谋士。刘备在庞统的极力推荐下,进攻四川,期间庞统在落凤坡被杀。经过几场战役,刘备顺利拿下四川,赶走刘璋,自领益州牧。在刘备入川期间,关羽张飞等人还镇守在荆州等地。曹操听说刘备拿下了四川,更生气和着急了,起大军南下攻打刘备。曹操联合孙吴,首先围攻荆州关羽,关羽势单力薄,最后败走麦城,被孙权手下杀害。关羽的死开启了蜀国国势下降的进程。 曹丕篡位,诸葛亮劝告刘备也称帝,于是刘备在曹丕篡位的第二年,也称帝,至此,魏国和蜀国正式成立。刘备和张飞得知关羽被杀之后,对吴国恨之入骨,带着几十万大军,浩浩荡荡进攻吴国。张飞由于性情暴躁,加之关羽死了之后情绪不好,对手下太过苛刻,最终导致手下倒戈,杀了张飞,张飞死得太不值了。 于是,刘备就带着赵云、关羽和张飞的儿子们,杀奔吴国。沿路上,捷报频传,先后杀了关羽和张飞的凶手。但刘备还是不解恨,继续向东进发,在夷陵这个地方。吴国司令官陆逊深沟高垒,不出战,刘备就把军队带到了密林中避暑,没想到被陆逊火烧连营七百里。刘备大败,退守白帝城,没多久就病死了。 刘备儿子刘禅继位,刘禅傻乎乎的,蜀国大小事务基本都由诸葛亮来处理。诸葛亮为了实现刘备复兴汉室的愿望,南征北战,先是南下七擒孟获,后是北伐六出祁山。南征算是顺利,但北伐就没那么简单了,因为对方是实力强大的曹操,外加同样足智多谋的司马懿。于是,北伐没有取得实质性战果,诸葛亮最终也病故了。 接替诸葛亮的是姜维,但一方面姜维的谋略还是比不上诸葛亮的,另一方面后主刘禅昏庸无能,听信谗言,导致姜维几次北伐也没有取得实质性战果。司马昭趁刘禅昏庸,国势衰微,派大军进攻蜀国。最终,蜀国被司马昭灭亡,刘禅被俘虏到晋国,还乐不思蜀。 吴国 吴国的故事要从十八路诸侯讨伐董卓开始,这其中一路就有孙坚。相比其他诸侯,孙坚是比较敢于站出来说话甚至带头进攻的部队。虽然作为前锋部队,遭到了华雄等的暴击,但这种英勇的精神值得鼓励。在董卓焚烧了洛阳宫殿之后,孙坚部队第一个飞奔洛阳救火,同时,捡到了传国玉玺并私藏起来。后来,被盟主袁绍发现,孙坚感到很羞耻,就准备回老家江东,但是在路上遇到了袁绍派出的刘表阻击,自此孙坚和刘表结怨。 后来,孙坚在江东稳住阵脚之后,准备报仇,于是跨江击刘表,没成想遭到算计,被刘表部下杀害。孙坚大儿子孙策继位。孙策自从父亲被杀之后,投奔袁术,虽立了不少功,但还是想重振父业,于是把传国玉玺压在了袁术那里,借兵东征。孙策人称小霸王,接连占领东边和江南,奠定了孙吴在江南的霸主地位。 年复一年,孙策经营的吴国兵精粮足,常有袭击许都之心。后与吴郡太守许贡闹矛盾,被许贡家客射伤眼睛,后又被仙人激怒,毒性发作而死。弟弟孙权继位,孙权子承父兄业绩,广纳人才,吴国国力昌盛,又因为偏安江南,没有卷入太多的中原诸侯纷争,日子过得比较平静和舒坦。 直到曹操平定了北方,南下围剿刘备时,刘备向孙权求解,于是有了刘备和孙权联合起来抗击曹操的赤壁之战。赤壁之战虽然胜利,但胜利果实被刘备和诸葛亮窃取,孙权为没有得到荆州而耿耿于怀,与周瑜联合想了各种点子讨要荆州,都失败了。期间诸葛亮三气周瑜,孙权赔了夫人又折兵。 再后来,刘备被曹操攻打逼急了,才主动归还一半荆州给孙权,但要求孙权一起帮他抵抗曹操。在孙权和曹操的对抗中,双方互有胜负,孙权就给曹操写信说你还是早点撤军吧,咱也别在这瞎闹腾了,于是曹操撤军。刘备先后占领了汉中、四川之后,称王。曹操很生气,联合孙权围攻刘备。首当其冲的就是在荆州的关羽,关羽被围攻致死。 由于杀害关羽的直接凶手是吴国的人,于是刘备倾全国之力进攻吴国,孙权怂了,向曹丕俯首称臣,希望曹丕来救东吴,但曹丕隔岸观火,无动于衷。在刘备和陆逊的夷陵之战中,刘备大败而回。后来吴国又有了一段悠闲自在的日子,不久孙权就称帝了,至此魏蜀吴三国都成立了。在诸葛亮不断北伐期间,孙权在东吴接着过着悠闲自在的日子。就这样年复一年,孙权病故了,儿子孙亮继位。 孙亮时代,国家权力落在了孙峻手中,孙峻病故之后,又落到了从弟孙綝手中。没想到吴国也上演了孙亮发衣带诏的事情,当然,事情败露,孙綝罢黜孙亮,另立孙权第6个儿子孙休为皇帝。在司马炎篡位,蜀国灭亡等一系列事件之后,孙休积忧成疾,死了。孙权孙子孙皓继位,孙皓荒淫无道,百姓叫苦连天。司马炎乘机进攻吴国,吴国灭亡,孙皓被俘虏到晋国。从此天下一统,三家归晋。 相比于魏国和蜀国的发家之路,吴国的崛起和衰落都稍显平淡,一方面可能是《三国演义》对吴国着墨不多,另一方面可能是吴国偏安江南,没有卷入太多的诸侯纷争,确实可写的事情也不多吧。

July 22, 2019 · 1 min

《三国演义》每回内容梗概(91~120)

第九十一回 祭泸水汉相班师 伐中原武侯上表 诸葛亮平定南蛮之地后,准备班师回朝,路过泸水,被水中孤魂野鬼阻挡,不能前进。后来得知要用七七四十九个人头祭奠才能过河。诸葛亮仁慈之人,肯定不会杀人祭河,于是杀了很多牛羊,做成人头的样子,叫做“馒头”,祭奠泸水,这就是馒头的由来。最后孤魂野鬼散去,诸葛亮军队顺利回到成都。 此时,北方魏国皇帝曹丕病故,享年才40岁,在位仅7年。皇位传给曹丕儿子曹睿。正好雍州、凉州没有太守,司马懿毛遂自荐去当这两个州的太守。诸葛亮利用反间计,散布司马懿要篡位的谣言,离间曹睿和司马懿,最终曹睿罢免司马懿,把司马懿赶回老家种田。 另一方面,诸葛亮听说曹丕驾崩,幼子曹睿继位,打算北伐魏国。《出师表》就是这个时候写的。于是诸葛亮带着包括赵云在内的一路人马开始北伐。魏国那边就是夏侯渊的儿子夏侯楙前来迎敌。 第九十二回 赵子龙力斩五将 诸葛亮智取三城 诸葛亮带着赵云等大将来战夏侯楙,夏侯楙那边派出西凉大将韩德及其四个儿子出战,父子一共五个人都被赵云杀了。夏侯楙大败,退守南安城,赵云等三路军马围攻南安城。夏侯楙向周边的天水、安定两个城求解。被诸葛亮使用“诈称魏将”的计策破了南安和安定两个城,捉拿了夏侯楙。只有天水城没有被攻破,而且天水城的谋士姜维(字伯约)识破了诸葛亮的计谋。 第九十三回 姜伯约归降孔明 武乡侯骂死王朗 接着,诸葛亮带兵来攻打天水城,诸葛亮不知道天水城有姜维这么个文武双全的人才,低估了拿下天水城的难度。同时,姜维也巧妙的使用了兵法,所以在最初的几次战役中,诸葛亮大败。后来诸葛亮摸清了姜维的情况,精心安排了这样一个进攻策略:引一军打姜维老母亲所在地冀县;引一军打囤积粮草之地上邽;引一军打天水城。这个安排一方面把姜维引入到冀县,另一方面分散了天水城的兵力,导致天水城内部大乱。同时,诸葛亮放走夏侯楙,让他去招安姜维;还让人假扮姜维,制造各种姜维已经投降蜀汉的迹象,离间姜维和魏国。最后假戏真做,姜维无路可走,真的投降了蜀汉。在姜维的帮助下,天水城也拿下了。 诸葛亮拿下汉中三城之后,一路北上,前出祁山,兵临渭水。魏国皇帝曹睿听说后大惊,派出以曹真为大都督,郭淮为副都督,司徒王朗为军师的大军来战诸葛亮。两阵对圆,王朗和诸葛亮出阵,两个人对骂,王朗先出招,骂诸葛亮反贼,不顺应天命;诸葛亮出招,骂王朗汉朝旧臣,都76岁高龄了还出来招摇,助纣为虐,死后有何颜面见二十四帝。最后王朗被诸葛亮骂死。 这天晚上,曹真算准诸葛亮会乘丧劫寨,诸葛亮也将计就计去劫寨,但是还是诸葛亮老谋深算,劫寨之战以诸葛亮大获全胜。 第九十四回 诸葛亮乘雪破羌兵 司马懿克日擒孟达 曹真部队失败之后,向西羌求救。西羌自曹操时代开始向曹操进贡,这次听闻魏国求救,于是答应了,派了丞相雅丹和武将越吉共15万大军去偷袭蜀国大本营。诸葛亮听说后,只能分出一部分兵力去抵抗西羌。派出去的关兴和张苞都被勇猛的西羌兵打败了。没办法,诸葛亮留赵云守祁山,自己亲自去西羌前线,巧妙的利用积雪,大破羌兵,杀了越吉,俘虏雅丹。诸葛亮放雅丹回国,西羌事平。 另一方面,曹真听说诸葛亮退了一部分兵,于是趁机出兵攻打祁山。没想到被镇守的赵云和魏延大败。没办法,曹真求救曹睿皇帝。与此同时,之前关羽败走麦城向孟达求救,孟达没救并投降了魏国。这个时候,孟达又想回到蜀国的怀抱了,诸葛亮同意,让孟达攻打洛阳,诸葛亮攻打长安。 曹睿如临大敌,太傅钟繇推荐把之前罢免的司马懿请回来。司马懿的军事才能应该不下于诸葛亮,且两个儿子(长子司马师、次子司马昭)素有大志,通晓兵法。司马懿复出的第一战就是大战孟达。结果司马懿获胜,孟达被杀。接着,曹睿正式派司马懿出关破蜀,司马懿带着大将张郃,浩浩荡荡,前来抗诸葛亮。 第九十五回 马谡拒谏失街亭 武侯弹琴退仲达 诸葛亮算准了司马懿会首先进攻街亭,因为街亭是汉中的咽喉要道,一旦街亭失守,汉中就很危险了。马谡主动请缨去守街亭,于是诸葛亮派马谡主守街亭,同时派魏延、王平等驻扎在街亭附近支援马谡。 马谡来到街亭之后,觉得这么个小地方,不足为惧,也不听王平的劝诫,非要在山上驻扎。司马懿来了之后,先断了山上游的水源,把山团团围住。马谡军中自乱,最后抵挡不住司马懿的大军,败下阵来。尽管有王平、魏延等的支援,依然不敌司马懿的大军。 诸葛亮听说马谡大败之后,知道事情很危急,准备从祁山退军回到汉中。同时,为了不制造很大的动静,不让魏军后方的曹真等乘虚而入,诸葛亮各种算计,把关兴、张苞等身边的武将都派出去了。诸葛亮自己带着一帮文官守在西城。司马懿也算到了诸葛亮在西城,于是引大军来打西城。诸葛亮因为实在没有兵了,使出了空城计,把城门大开,军旗尽去,只安排几个士兵扮装老百姓的样子在城门口扫地。司马懿看到后,疑神疑鬼,因为知道诸葛亮向来深思熟虑,这次突然把城门大开,肯定有很大的埋伏,于是退兵了。诸葛亮的空城计成功了。 在整个混乱的过程中,诸葛亮和司马懿互相算计,总的来说,互有胜负吧。结果就是诸葛亮暂停北伐脚步,退出祁山,回到汉中。司马懿收复陇西诸郡。 第九十六回 孔明挥泪斩马谡 周鲂断发赚曹休 却说诸葛亮回到汉中之后,清点人马,因马谡之前有军令状,且是因为他不听王平劝诫才导致蜀军大败的,根据军法,挥泪斩马谡。 话分两头,东吴的周鲂给曹休发了诈降书,且为了让曹休相信自己是真的投降,还把头发割掉了。最后曹休相信周鲂,曹睿派包括曹休在内的三路大军前去攻打东吴。结果很显然,曹休中计,大败而回,气忧成病,回到洛阳就死了。 第九十七回 讨魏国武侯再上表 破曹兵姜维诈献书 因东吴帮忙击败了曹休,遂发书给诸葛亮让他再次出兵北伐,诸葛亮给后主写了《后出师表》,表明自己鞠躬尽瘁死而后已的精神,再次北伐。就在这时,传来一个坏消息,大将赵云病故,留下两个儿子赵统和赵广。于是诸葛亮北伐只剩几个老将和小将了:魏延、关兴、张苞、王平等。 魏蜀两军在陈仓口(陈仓口再往北就是街亭)交锋,魏国守陈仓的是郝昭,深沟高垒,诸葛亮使出了各种计谋都没能攻破城池。同时,魏国朝廷派出大将军曹真和身强力壮的王双前来接应。诸葛亮派出的两员大将都被王双打败并杀了。 最后,姜维使出诈降计,本来想赚曹真的,结果只赚到曹真的一个大将费耀。蜀军大获全胜,虽然没有杀到曹真,杀到费耀也不错。同时曹真损兵折将,蜀军又出祁山(第二次)。 第九十八回 追汉军王双受诛 袭陈仓武侯取胜 却说诸葛亮第二次出祁山时,由于粮草只够支撑一个月时间,汉中前线只有陈仓这一个地方方便运粮,而陈仓被魏国的郝昭和王双把守着,所以诸葛亮必须速战速决,否则粮草支撑不住。魏国大都督就想了个办法,让部队假装运粮,吸引蜀军来抢粮食,实际粮车里装的都是干柴硫磺等易燃物,等蜀军来抢的时候,把蜀军烧死,同时突袭蜀军营寨。但是这个计策怎么能难倒诸葛亮,诸葛亮算准了,而且将计就计,结果反而把假扮运粮的魏军干掉了。但是蜀军毕竟是没粮了,不能恋战,而且曹睿此时又派了张郃领军来支援,于是,诸葛亮在赢了这一战的情况下,果断撤军。魏军此时刚刚失败,也不敢追诸葛亮。但是魏延军队在陈仓口防御王双,撤离的话,王双肯定是会和魏延干起来的。于是诸葛亮撤军的时候,偷偷给魏延一个锦囊妙计,大部队假装撤军,让王双来追,魏延和一小支部队等王双追出去之后,把王双营寨端了,王双回寨时,魏延又出其不意把王双干掉了。所以诸葛亮第二次出祁山,虽然没有干掉魏国,但是也小挫了一把魏军,同时安全回到汉中。曹真听说王双被杀,忧成疾病。 此时,吴国孙权称帝了,蜀国派人前去祝贺,同时想联合吴国一起伐魏。吴国假装同意,实则想隔岸观火,坐收渔翁之利。 又过了一阵子,诸葛亮听到守陈仓的郝昭病危,觉得这是一个进攻陈仓的好机会,于是又率部队去袭击陈仓,没等张郃救兵赶到,诸葛亮大军就把陈仓城攻破了,郝昭本来就病危,被这么一攻,吓死了。等张郃赶到的时候,发现诸葛亮大军把各个路段都占领了,于是退军。随后,诸葛亮又趁胜追击,拿下了散关。这就是诸葛亮第三次出祁山。 曹睿听说诸葛亮又来了,吓死了,这个时候曹真病又没好,于是就把曹真的大都督职位交给了司马懿。司马懿出兵来与诸葛亮决战。 第九十九回 诸葛亮大破魏兵 司马懿入寇西蜀 司马懿带着张郃等人前来与诸葛亮决战,但是前几次战争都失败了,于是司马懿决定深沟高垒,不再出战。此时,诸葛亮使用缓兵之计,每隔几天退几十里,给魏军要撤退的错觉。司马懿知道诸葛亮诡计多端,不敢追杀,但是大将张郃不同意,非要去追杀诸葛亮。司马懿没办法,让张郃先去追杀,自己随后就到。诸葛亮算准了司马懿的安排,调兵遣将,不但抵抗住了追杀,还安排部队袭击了司马懿的营寨。司马懿大败而回,虽然诸葛亮没有占领司马懿的营寨,但是歼敌无数。 在这个过程中,虽然蜀军胜利,但是在一次战争中,张苞(张飞的儿子)不小心骑马掉到河里了,把头磕破了,回成都养病,但是后来死了。诸葛亮悲痛欲绝,决定撤军。诸葛亮第三次出祁山也没有显著成果。 又过了一段时间,曹真病好了,决定和司马懿率大军进攻蜀国,曹睿同意。于是这两人率40万大军进攻蜀国。诸葛亮算准了接下来一个月都要下雨,蜀国地势又复杂,魏军远道而来,天时地利都不好,所以不用担心。果然这一个月都阴雨连绵,魏军粮草不够,很多士兵都饿死了。没办法,魏军主动撤退。 第一百回 汉兵劫寨破曹真 武侯斗阵辱仲达 魏军退了之后,诸葛亮并不追杀,而是准备再次出祁山(第四次)。诸葛亮安排兵分两路,一路魏延、张嶷、杜琼、陈式攻打祁山之东箕谷,一路马岱、王平、张冀、马忠攻打祁山之西斜谷,然后会于祁山。司马懿算准了诸葛亮有这个安排,于是也兵分两路,司马懿守箕谷,曹真守斜谷,而且他两还打赌,如果诸葛亮真的来攻打,则司马懿赢,否则曹真赢。 攻打箕谷的陈式不相信有司马懿的埋伏,不听劝阻,导致被司马懿打败,损兵折将。事后诸葛亮按军法处置,把陈式杀了。而另一方面,曹真不相信诸葛亮会攻打斜谷,消极守军,于是被马岱那路军马打败,诸葛亮顺利出祁山(第四次)。 有一天,情报说曹真卧病不起,诸葛亮于是写了封信送给曹真看,把曹真骂了一顿,曹真看到信后怀恨而死。魏主曹睿命令司马懿出战。于是两军对峙,司马懿和诸葛亮开始比军事才能(斗阵),司马懿大败。诸葛亮收得胜之兵回祁山,永安城李严派来的送粮官苟安来送粮,但是延误了十天。诸葛亮很生气,按军法该杀,但是手下都求救,诸葛亮就给苟安杖打八十大板放回去了。苟安怀恨在心,投降司马懿。司马懿利用苟安,把苟安放回成都,但是要苟安散布谣言,造谣说诸葛亮要篡后主的位。后主就下令让诸葛亮撤军回成都。 诸葛亮很伤心,好不容易又出一次祁山,而且战情对自己有利,现在居然被皇上下令撤军,没办法只好撤军了。不过,诸葛亮要杀苟安,后又不杀,杖打八十大板回去,这是很危险的,诸葛亮应该能想到这个小兵会叛变。要不就果断按军法处置杀了,要不就好好安抚。唉,错失良机啊。 第一百一回 出陇上诸葛妆神 奔剑阁张郃中计 诸葛亮回到成都,查明了事情的真相,后主自己都不好意思了,但是苟安已经逃到魏国去了。 过了一阵子,诸葛亮又上书要北伐魏国,于是第五次出祁山,兵分两路,王平等四个大将守祁山,诸葛亮带着魏延姜维守卤城。因粮草不够,打算去附近的陇上麦田割点麦子当粮食。司马懿算准了诸葛亮会兵分两路,于是也兵分两路,一路张郃守祁山,司马懿亲自带着人马去陇上。诸葛亮和司马懿在陇上交战,诸葛亮使用“奇门遁甲”之术,“变出”好多个诸葛亮,迷惑司马懿及魏军,然后偷偷安排大部队去陇上割麦。结果,魏军被诸葛亮迷惑得糊里糊涂,还损兵三千,蜀军割麦成功。 正当诸葛亮优势比较明显时,又出幺蛾子了。诸葛亮突然收到粮草官李严的来信,说东吴接连魏国,打算进攻蜀国大后方。诸葛亮大惊,没办法,决定撤军。退军时,诸葛亮又布下了迷阵,让魏军不敢追杀。但是张郃偏偏要逞能,决定去追杀诸葛亮,在追杀的路上,被诸葛亮的埋伏给杀了。 诸葛亮安全退回汉中,然后急忙回成都一探究竟,结果吴国并没有要进攻蜀国,而是李严谎报军情,因为李严是粮草官,因凑不齐给诸葛亮北伐的粮草,怕被诸葛亮惩罚,就向诸葛亮撒了这么一个谎,让诸葛亮回来。诸葛亮都快要被气死了,后主也很生气,打算杀了李严,但是朝廷官员说李严是刘备托孤的人之一,还是留一条活路吧,于是后主把李严贬为庶民,用李严的儿子李丰接替为粮草官。 第一百二回 司马懿占北原渭桥 诸葛亮造木牛流马 却说诸葛亮在蜀国休养了三年,人马雄壮,又准备北伐,有人就劝他,为啥不好好在蜀国待着享受生活呢?诸葛亮说:“臣受先帝知遇之恩,梦寐之间,未尝不设伐魏之策。竭力尽忠,为陛下克复中原,重兴汉室:臣之愿也。”于是第六次出祁山北伐。 ...

July 20, 2019 · 1 min

《三国演义》每回内容梗概(61~90)

第六十一回 赵云截江夺阿斗 孙权遗书退老瞒 却说孙权想乘刘备入川的时候,武力讨回荆州,于是想了个法子,派人去荆州找孙权的妹妹(刘备的老婆,孙夫人),说老母亲病危,让她带着阿斗快点回东吴。孙夫人信以为真,火急火燎带着阿斗走了,也没告诉任何人。走的途中,被赵云和张飞追上,夺回了阿斗,孙夫人一个人回了东吴。 此时,北方的曹操又南下攻打东吴,孙权只能暂时不管荆州,转而抵御曹操。曹操和孙权互相打了几个月,互有胜负,后来春雨连绵,困苦异常,曹操想撤军,又碍于面子。正好孙权写了一封信给曹操,劝曹操快点撤退吧,给了曹操一个台阶下,于是曹操就撤军了。 第六十二回 取涪关杨高授首 攻雒城黄魏立功 刘备听说孙夫人回东吴了,曹操南下打孙权,曹操和孙权任何一方赢了,都有可能乘势攻打荆州,于是打算回荆州。张松听说之后写信给刘备,叫他当机立断夺取益州,没想到消息泄露,刘璋知道了刘备和张松的计谋,把张松满门抄斩。同时开始对抗刘备。 庞统给刘备出了一条计策,先取涪城,后取雒城,最后夺成都。在涪城,刘璋手下杨怀、高沛守官,被庞统和刘备杀害,占领了涪城。在雒城,刘璋手下四员大将镇守(刘璝、泠苞、张任、邓贤),刘备手下黄忠和魏延争功,攻打雒城,杀了邓贤,但还是没有拿下雒城。 第六十三回 诸葛亮痛哭庞统 张翼德义释严颜 庞统和刘备决定再次对雒城发起进攻,但是庞统夜观天象,发现凶兆,诸葛亮也来信说需要提高警惕,可能要出事。庞统的马也发脾气把庞统摔下马来,刘备好心,把自己的马让给庞统骑,刘备骑庞统的马。 刘备和庞统分兵进攻,庞统进到一个落凤坡的地方,张任发现前面有一个人骑着刘备的马,以为就是刘备,集中放箭,误把庞统杀死了。庞统道号凤雏,正好在落凤坡牺牲。 刘备和庞统这一仗算是失败收场,退回涪城。刘备写信给诸葛亮求救,诸葛亮安排关羽留守荆州,带着张飞赵云去增援刘备。张飞打先锋,来到巴郡,巴郡太守严颜深沟高垒不出战。最终,张飞用计把严颜骗出城来,俘虏了严颜,但是觉得严颜是条好汉,放了严颜,严颜也归顺了张飞。 第六十四回 孔明定计捉张任 杨阜借兵破马超 孔明带着张飞和赵云来援助刘备攻打雒城,最后孔明用计活捉并杀死张任,夺取雒城。刘璋见雒城沦陷,派人求解汉中太守张鲁。 话分两头,马超自从兵败曹操之后,退守羌地,在羌地占领了一大片地方,但是唯独冀城攻打不下。冀城刺史韦康求救夏侯渊也没被曹操同意。于是韦康就投降马超了,但是马超觉得韦康没诚意,把韦康灭门了。韦康手下杨阜先假装投降马超,然后说妻子死了要回老家奔丧,于是溜出冀城,联合几个表兄弟来反攻马超。此时,夏侯渊也得到曹操允许,要打马超。马超就被一堆人围攻,最后惨败,马超妻子和孩子都被杀了。马超最后仅剩下几个人逃到汉中张鲁手下。 第六十五回 马超大战葭萌关 刘备自领益州牧 却说刘璋求救于张鲁,马超说自己刚来到张鲁手下,打算立个功,就主动请缨去帮刘璋打刘备吧。张鲁同意。 于是,马超在葭萌关和张飞大战了几百回合,不分胜负。后来,孔明用计离间了马超和张鲁,然后凭三寸不烂之舌说服马超投降刘备。 刘璋见大势已去,主动打开成都城门,让出益州,投降刘备。自此,刘备占领四川,成为益州牧。至于刘璋,刘备把他赶出四川,派到一个小地方(南郡公安)住了。 第六十六回 关云长单刀赴会 伏皇后为国捐生 刘备夺取了益州之后,孙权又打算要回荆州。诸葛亮的哥哥诸葛瑾在孙权手下当谋士,于是把诸葛瑾一家老小都软禁了,跟诸葛瑾说诸葛亮要是再不还荆州,就把诸葛瑾一家灭门。于是派诸葛瑾去成都找诸葛亮讨还荆州。诸葛亮和刘备又演了一场戏,诸葛亮大哭,求刘备,刘备最终同意把荆州的三个郡还给孙权。但是实际镇守荆州的是关羽,关羽又耍赖皮,说将在外军令有所不受,不认刘备的书信。这次讨回荆州又失败了。后来鲁肃又想了一点子,请关羽赴鸿门宴,打算把关羽杀了,武力夺取荆州。关羽霸气十足,单刀赴会。在宴席上和手下周仓又演了一出戏。关羽假装喝醉酒了,仅仅握着鲁肃的手,鲁肃手下怕伤了鲁肃,也不敢动手围攻关羽。就这样,关羽实质上拿鲁肃当了人质,直到关羽上船成功逃离鸿门宴。鲁肃的计谋又失败了,不过这关羽也真够抵赖的。 话分两头,曹操在许昌更加狂妄自大,还打算自立为魏王,谋士荀彧进谏说这样不好,被曹操训了一顿,荀彧忧愤成疾,死了。。。汉献帝和伏皇后也瑟瑟发抖,伏皇后就秘密派人出去给父亲伏完送信,让他铲除曹贼,结果事情泄漏,伏皇后、伏皇后和汉献帝的两个儿子,和伏完一家都被曹操杀死了。然后,曹操还强行把自己的女儿嫁给了汉献帝。 第六十七回 曹操平定汉中地 张辽威震逍遥津 话说曹操势力越来越大,商议先取汉中,再收吴蜀。于是曹操亲自起大军攻打张鲁,经过几次战役,使了诈降、离间等计谋,最终夺取汉中地盘,原汉中太守张鲁投降曹操,被曹操封为镇南将军。 此时曹操想得陇望蜀,顺势把蜀国也端了,四川人民听说曹操拿下汉中, 瑟瑟发抖。诸葛亮想到一个计策,曹操大军都在汉中这边,东边合淝等地空虚,可以再次联合东吴,让东吴进攻合淝,则曹操无暇再攻打西川了。于是这一次,刘备真的就把荆州一半地盘还给孙权了,然后和孙权说明了利害关系,孙权和谋士商量了一下,觉得进攻合淝对自己也有利,于是欣然同意了。孙权起大军进攻合淝。 合淝等地当前由张辽、李典、乐进等人守关。由于敌众我寡,初期的几次战役都失败了,还丢了皖城。在逍遥津一战中,张辽排兵布阵很有讲究,加上使用诈降等计谋,成功重创了孙权部队,此即张辽威震逍遥津。但是孙权也不气馁,不断从东吴大本营调兵来前线。张辽自知敌众我寡,于是也赶紧去汉中找曹操搬救兵。 第六十八回 甘宁百骑劫魏营 左慈掷杯戏曹操 曹操带大军来救合淝,和孙权在濡须口对峙。孙权手下大将甘宁自告奋勇,趁曹军初到,晚上只带一百个人去曹营劫寨,狠狠的挫了曹操的锐气。但是曹操毕竟势力强大,孙权在某一次战役中被困垓心,差点丧命。互相对峙了几个月,孙权看短期内取胜无望,决定和曹操求和,同时给曹操上贡。曹操同意,于是各自撤军了。 曹操回到许昌后,建安二十一年夏,正式称王,即魏王。曹操大老婆丁夫人没生儿子;妾刘氏生曹昂,在南征张绣时战死;卞氏生四个儿子:曹丕,曹彰,曹植,曹熊。立长子曹丕为世子。 曹操称王之后,有一个左慈来到许昌戏弄曹操,制造了各种灵异事件,比如曹操的橘子,拨开之后是空的;变出龙肝;变出牡丹花;变出松江鲈鱼等等。左慈还给曹操敬酒,曹操让左慈先喝,左慈把杯中酒一分为二,自饮一半,另一半给曹操。曹操大怒,左慈将杯变成一只白鸟飞走了。曹操恼羞成怒,但是无论怎样都杀不死左慈。 第六十九回 卜周易管辂知机 讨汉贼五臣死节 曹操被左慈吓出病来。有人就请来了另一个“算命的”人管辂帮曹操算命,管辂告诉曹操这是幻术不要担心,曹操心宽,没几天病就好了。 曹操又叫管辂算算东吴和西蜀,管辂说东吴有一员大将要亡,西蜀要出兵进犯汉中。果然没几日,有人来报东吴鲁肃死了,西蜀要出兵进犯曹操。曹操大怒,想要大举进军西蜀,管辂说且慢,来年春天许昌有火灾,于是曹操没进军,只是派几支军队加强西川防守,同时对首都许昌加强巡逻,防止火灾。 却说许昌有五个汉朝官员,秘密商议,在元宵节放花灯的情况下,起兵讨伐曹贼。于是元宵节那天,许昌出现火灾,京城大乱。幸好管辂帮曹操算过,曹操也早有提防,叛乱被迅速镇压,五个汉臣也牺牲了。 第七十回 猛张飞智取瓦口隘 老黄忠计夺天荡山 上回说到管辂算到西蜀出兵进犯汉中,即张飞带领部队去夺取瓦口隘(曹操手下张郃守关),张飞使用激将法激怒张郃,两军交战,张郃大败。后又使用前后包围方法,最终大败张郃,占领瓦口隘。 张郃败走,曹洪又命令张郃去夺取葭萌关。葭萌关守将霍峻和孟达不敌张郃。刘备派手下黄忠和严颜两员老将前去增援。黄忠使用骄兵之计,大胜张郃。张郃败走,退到天荡山,天荡山是夏侯德镇守。黄忠和严颜使用前后包抄的方法,夺取天荡山,杀了夏侯德。张郃大败,又转投定军山夏侯渊处。定军山是汉中囤积粮草的地方,战略意义重大,所以曹操留夏侯渊在此镇守。 第七十一回 占对山黄忠逸待劳 据汉水赵云寡胜众 张郃败走定军山之后,曹操知事情严重,亲自带兵四十万来战刘备。这个时候,老将黄忠又主动请缨,要求打定军山。诸葛亮拦不住,就派黄忠和法正一起去了,同时安排赵云在后面接应。 在定军山一战中,黄忠发现定军山的西边有一座山,比定军山还高,而且可以俯瞰定军山内虚实,于是黄忠趁某个夜黑风高的晚上,占领了这座山。夏侯渊气坏了,被迫出战。法正和黄忠,一个在山顶观察敌情,另一个在山腰准备迎战。两队人马的配合,最终大败了夏侯渊,黄忠杀了夏侯渊,曹军大败,定军山失守,曹军移粮草去北山寨中。 曹操听说自己的心腹大将夏侯渊被杀,很生气,亲自督战来定军山与夏侯渊报仇。在汉水附近,黄忠和赵云商量,黄忠前去烧粮草,赵云在后面接应,如果规定时间黄忠没回来,则赵云去救援。 黄忠去烧粮草的时候,被曹操大军围困。赵云带队前去救援,赵云一个人冲入重围,如入无人之境,救出黄忠和副将张著。抵抗住了曹操在汉水的进攻。 第七十二回 诸葛亮智取汉中 曹阿瞒兵退斜谷 刘备军团和曹操军团,以汉水为界,互相进攻。诸葛亮利用曹操多疑的性格,打败曹操。曹操接连丢失汉水,阳平关,退到斜谷界口。期间,曹操还把杨修杀了,因为杨修各种耍小聪明,曹操很讨厌他,在一次“鸡肋”事件中,以扰乱军心为名,杀了杨修。 第七十三回 玄德进位汉中王 云长攻拔襄阳郡 曹操在汉中和刘备的战争中,接连失败,最后彻底丢掉了汉中。至此,刘备占据四川、汉中和一半的荆州。刘备手下百官和诸葛亮就商议推举刘备为皇帝,刘备哪里肯自立皇帝,连连推辞。但是大家苦苦相劝,最后刘备自立为汉中王。 ...

July 17, 2019 · 1 min