请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

有关自然言语处理的深度学习知识有哪些?

[size=0.667em]偏置是神经元中常用的输入项。和其他输入元素一样,神经元会给偏置一个权重,该权重与其他权重用异样的方式来训练。在关于神经网络的各种文献中,偏置有两种表示方式。一种表示方式是将其表示为输入向量,例如对于n维向量的输入,在向量的扫尾或结尾处添加一个元素,构成一个n + 1维的向量。1的地位与网络有关,只需在一切样本中保持分歧即可。另一种表示方式是,首先假定存在一个偏置项,将其独立于输入之外,其对应一个独立的权重,将该权重乘以1,然后与样本输入值及其相关权重的点积停止加和。这两者实践上是一样的,只不过分别是两种常见的表示方式而已。
[size=0.667em]设置偏置权重的缘由是神经元需求对全0的输入具有弹性。网络需求学习在输入全为0的状况下输入照旧为0,但它能够做不到这一点。假如没有偏置项,神经元对初始或学习的恣意权重都会输入0 × 权重 = 0。而有了偏置项之后,就不会有这个成绩了。假如神经元需求学习输入0,在这种状况下,神经元可以学会减小与偏置相关的权重,使点积保持在阈值以下即可。
[size=0.667em]图5-3用可视化方法对生物的大脑神经元的信号与深度学习人工神经元的信号停止了类比,假如想要做更深化的了解,可以思索一下你是如何运用生物神经元来阅读本书并学习有关自然言语处理的深度学习知识的[5]。



[size=0.667em]图5-3 感知机与生物神经元

[size=0.667em]用数学术语来说,感知机的输入表示为f (x),如下:



[size=0.667em]公式5-1 阈值激活函数

[size=0.667em]提示  
[size=0.667em]输入向量(X)与权重向量(W)两两相乘后的加和就是这两个向量的点积。这是线性代数在神经网络中最基础的运用,对神经网络的发展影响宏大。另外,经过古代计算机GPU对线性代数操作的功能优化来完成感知机的矩阵乘法运算,使得完成的神经网络变得极为高效。
[size=0.667em]此时的感知机并未学到任何东西,不过大家曾经获得了非常重要的结果,我们曾经向模型输入数据并且得到输入。当然这个输入能够是错误的,由于还没有告诉感知机如何获得权重,而这正是最风趣的地方所在。
[size=0.667em]提示  
[size=0.667em]一切神经网络的基本单位都是神经元,基本感知机是广义神经元的一个特例,从如今末尾,我们将感知机称为一个神经元。
1.Python版神经元

[size=0.667em]在Python中,计算神经元的输入是很简单的。大家可以用numpy的dot函数将两个向量相乘:
>>> import numpy as np>>> example_input = [1, .2, .1, .05, .2]>>> example_weights = [.2, .12, .4, .6, .90]>>> input_vector = np.array(example_input)>>> weights = np.array(example_weights)>>> bias_weight = .2>>> activation_level = np.dot(input_vector, weights) +\...     (bias_weight * 1)   ⇽--- 这里bias_weight * 1只是为了强调bias_weight和其他权重一样:权重与输入值相乘,区别只是bias_weight的输入特征值总是1>>> activation_level0.674[size=0.667em]接上去,假设我们选择一个简单的阈值激活函数,并选择0.5作为阈值,结果如下:
>>> threshold = 0.5>>> if activation_level >= threshold:...    perceptron_output = 1... else:...    perceptron_output = 0>>> perceptron_output)1[size=0.667em]对于给定的输入样本example_input和权重,这个感知机将会输入1。假如有许多example_input向量,输入将会是一个标签集合,大家可以检查每次感知机的预测能否正确。
2.课堂工夫

[size=0.667em]大家曾经构建了一个基于数据停止预测的方法,它为机器学习创造了条件。到目前为止,权重都作为恣意值而被我们忽略了。实践上,它们是整个架构的关键,如今我们需求一种算法,基于给定样本的预测结果来调整权重值的大小。
[size=0.667em]感知机将权重的调整看成是给定输入下预测系统正确性的一个函数,从而学习这些权重。但是这一切从何末尾呢?未经训练的神经元的权重一末尾是随机的!通常是从正态分布中选取趋近于零的随机值。在后面的例子中,大家可以看到从零末尾的权重(包括偏置权重)为何会导致输入全部为零。但是经过设置宏大的变化,无须提供给神经元太多的才能,神经元便能以此为根据判别结果何时为对何时为错。
[size=0.667em]然后就可以末尾学习过程了。经过向系统输入许多不同的样本,并根据神经元的输入能否是我们想要的结果来对权重停止宏大的调整。当有足够的样本(且在正确的条件下),误差应该逐渐趋于零,系统就经过了学习
[size=0.667em]其中最关键的一个窍门是,每个权重都是根据它对结果误差的贡献程度来停止调整。权重越大(对结果影响越大),那么该权重对给定输入的感知机输入的正确性/错误性就负有越大的责任。
[size=0.667em]假设之前的输入example_input对应的结果是0:
>>> expected_output = 0>>> new_weights = []>>> for i, x in enumerate(example_input):...     new_weights.append(weights + (expected_output -\...         perceptron_output) * x)   ⇽--- 例如,在上述的第一次计算中,new_weight = 0.2 + (0 - 1) × 1 = −0.8 >>> weights = np.array(new_weights)>>> example_weights  ⇽--- 初始权重[0.2, 0.12, 0.4, 0.6, 0.9]>>> weights  ⇽--- 新的权重[-0.8  -0.08  0.3  0.55  0.7][size=0.667em]这个处理方法将同一份训练集反复输入网络中,在适当的状况下,即便是对于之前没见过的数据,感知机也能做出正确的预测。
3.风趣的逻辑学习成绩

[size=0.667em]下面运用了一些随机数字做例子。我们把这个方法运用到一个详细成绩上,来看看如何经过仅向计算机展现一些标记样本来教它学会一个概念。
[size=0.667em]接上去,我们将让计算机了解逻辑或(OR)。假如一个表达式的一边或另一边为真(或两边都为真),则逻辑或语句的结果为真。这个逻辑非常简单。对于以下这个成绩,我们可以手动构造一切能够的样本(在理想中很少出现这种状况),每个样本由两个信号组成,其中每个信号都为真(1)或假(0),如代码清单5-1所示。
[size=0.667em]代码清单5-1 逻辑或成绩

>>> sample_data = [[0, 0],  # False, False...                [0, 1],  # False, True...                [1, 0],  # True, False...                [1, 1]]  # True, True>>> expected_results = [0,  # (False OR False) gives False...                     1,  # (False OR True ) gives True...                     1,  # (True  OR False) gives True...                     1]  # (True  OR True ) gives True>>> activation_threshold = 0.5[size=0.667em]我们需求一些工具,numpy可以用来做向量(数组)乘法,random用来初始化权重:
>>> from random import random>>> import numpy as np>>> weights = np.random.random(2)/1000  # Small random float 0 < w < .001>>> weights[5.62332144e-04 7.69468028e-05][size=0.667em]这里还需求一个偏置:
>>> bias_weight = np.random.random() / 1000>>> bias_weight0.0009984699077277136[size=0.667em]然后将其传递到流水线中,计算得到4个样本的预测结果,如代码清单5-2所示。
[size=0.667em]代码清单5-2 感知机随机预测

>>> for idx, sample in enumerate(sample_data):...     input_vector = np.array(sample)...     activation_level = np.dot(input_vector, weights) +\...         (bias_weight * 1)...     if activation_level > activation_threshold:...         perceptron_output = 1...     else:...         perceptron_output = 0...     print('Predicted {}'.format(perceptron_output))...     print('Expected: {}'.format(expected_results[idx]))...     print()Predicted 0Expected: 0Predicted 0Expected: 1Predicted 0Expected: 1Predicted 0Expected: 1[size=0.667em]随机的权重值对这个神经元没有多大协助,我们得到1个正确、3个错误的预测结果。接上去我们让网络继续学习,并在每次迭代中不只是打印1或0,而是同时更新权重值,如代码清单5-3所示。
[size=0.667em]代码清单5-3 感知机学习

>>> for iteration_num in range(5):...     correct_answers = 0...     for idx, sample in enumerate(sample_data):...         input_vector = np.array(sample)...         weights = np.array(weights)...         activation_level = np.dot(input_vector, weights) +\...             (bias_weight * 1)...         if activation_level > activation_threshold:...             perceptron_output = 1...         else:...             perceptron_output = 0...         if perceptron_output == expected_results[idx]:...             correct_answers += 1...         new_weights = []...         for i, x in enumerate(sample):   ⇽--- 这就是运用魔法的地方。当然还有一些更高效的方法来完成,不过我们还是经过循环来强调每个权重是由其输入(xi)更新的。假如输入数据很小或为零,则无论误差大小,该输入对该权重的影响都将会很小。相反,假如输入数据很大,则影响会很大...             new_weights.append(weights + (expected_results[idx] -\...                  perceptron_output) * x)...         bias_weight = bias_weight + ((expected_results[idx] -\...             perceptron_output) * 1)   ⇽--- 偏置权重也会随着输入一同更新...         weights = np.array(new_weights)...     print('{} correct answers out of 4, for iteration {}'\...         .format(correct_answers, iteration_num))3 correct answers out of 4, for iteration 02 correct answers out of 4, for iteration 13 correct answers out of 4, for iteration 24 correct answers out of 4, for iteration 34 correct answers out of 4, for iteration 4[size=0.667em]哈哈!这个感知机真是个好先生。经过外部循环更新权重,感知机从数据集中学习了阅历。在第一次迭代后,它比随机猜测(正确率为1/4)多得到了两个正确结果(正确率为3/4)。
[size=0.667em]在第二次迭代中,它过度修正了权重(更改了太多),然后经过调整权重来回溯结果。当第四次迭代完成后,它曾经完美地学习了这些关系。随后的迭代将不再更新网络,由于每个样本的误差为0,所以不会再对权重做调整。
[size=0.667em]这就是所谓的收敛。当一个模型的误差函数达到了最小值,或者波动在一个值上,该模型就被称为收敛。有时分能够没有这么侥幸。有时神经网络在寻觅最优权值时不断波动以满足一批数据的互相关系,但无法收敛。在5.8节中,大家将看到目的函数(objective function)或损失函数(loss function)如何影响神经网络对最优权重的选择。
4.下一步

[size=0.667em]基本感知机有一个固有缺陷,那就是,假如数据不是线性可分的,或者数据之间的关系不能用线性关系来描画,模型将无法收敛,也将不具有任何有效预测的才能,由于它无法准确地预测目的变量。
[size=0.667em]早期的实验在仅基于样本图像及其类别来停止图像分类的学习上获得了成功。这个概念在早期很激动人心,但很快遭到了来自明斯基(Minsky)和佩珀特(Papert)的考验[6],他们指出感知机在分类方面有严重的局限性,他们证明了假如数据样本不能线性可分为独立的组,那么感知机将无法学习如何对输入数据停止分类。
[size=0.667em]线性可分的数据点(如图5-4所示)对感知机来说是没有成绩的,而存在类别交叉的数据将导致单神经元感知机原地踏步,学习预测的结果将不比随机猜测好,表现得就像是在随机抛硬币。在图5-5中我们就无法在两个类(分别用点和叉表示)之间画一条分割线。



[size=0.667em]图5-4 线性可分的数据




[size=0.667em]图5-5 非线性可分的数据

[size=0.667em]感知机会用线性方程来描画数据集的特征与数据集中的目的变量之间的关系,这就是线性回归,但是感知机无法描画非线性方程或者非线性关系。


[size=0.667em]



[size=0.667em]部分极小值与全局极小值
[size=0.667em]当一个感知机收敛时,可以说它找到了一个描画数据与目的变量之间关系的线性方程。但是,这并不能阐明这个描画性线性方程有多好,或者说代价有多“小”。假如有多个处理方案,即存在着多个能够的极小代价,它只会确定一个由权重初始值决议的、特定的极小值。这被称为部分极小值,由于它是在权重末尾的地方附近找到的最优值(最小的代价)。它能够不是全局极小值,由于全局极小值需求搜索一切能够的权重值。在大多数状况下,无法确定能否找到了全局极小值。



[size=0.667em]



[size=0.667em]很多数据值之间的关系不是线性的,也没有好的线性回归或线性方程可以描画这些关系。许多数据集不能用直线或平面来线性分割。由于世界上的大多数数据不能由直线或平面来清楚地分开,明斯基和佩珀特发表的“证明”让感知机被置之不理。
[size=0.667em]但是有关感知机的想法并不会就此消亡。Rumelhardt McClelland的合作成果[7](Geoffrey Hinton也参与其中)展现了可以运用多层感知机的组合来处理异或(XOR)成绩[8],此后感知机再次浮出水面。之前,大家运用单层感知机处理的或(OR)成绩属于比较简单的成绩,也没有用到多层反向传播。Rumelhardt McClelland的关键打破是发现了一种方法,该方法可以为每个感知机适当地分配误差。他们运用的是一种叫反向传播的传统思想,经过这种跨越多个神经元层的反向传播思想,第一个古代神经网络诞生了。
[size=0.667em]基本感知机有一个固有的缺陷,即假如数据不是线性可分的,则模型不会收敛到具有有效预测才能的解。
[size=0.667em]留意 
[size=0.667em]代码清单5-3中的代码经过一个单层感知机处理了或成绩。代码清单5-1代码中感知机学到的0和1组成的表格是二元逻辑或的输入结果。异或成绩稍微改变了一下该数据表,以此来教感知机如何模拟一个独占的逻辑或门。假如改变一下最后一个示例的正确结果,将1(真)改为0(假),从而将其转换为逻辑异或,这个成绩就会变得困难许多。在不向神经网络添加额外神经元的状况下,每类(0或1)样本将是非线性可分的。在二维特征向量空间中,这些类彼此呈对角线分布(相似于图5-5),所以无法经过画一条直线来区分出数据样本1(逻辑真)和0(逻辑假)。
[size=0.667em]虽然神经网络可以处理复杂的非线性成绩,但是那时计算成本太高,用两个感知机和一堆花哨的反向传播数学算法来处理异或成绩被以为是对宝贵计算资源的极大糜费,由于这个成绩只需求用一个逻辑门或一行代码就能处理。理想证明,它们不合适被广泛运用,所以只能再次回到学术界和超级计算机实验的角落。由此开启了第二次“人工智能寒冬”,这种状况从1990年持续到2010年左右[9]。后来,随着计算才能、反向传播算法和原始数据(例如猫和狗的标注图像[10])的发展,昂贵的计算算法和有限的数据集都不再是妨碍。第三次神经网络时代末尾了。
[size=0.667em]下面我们来看看他们发现了什么。
5.第二次人工智能寒冬的出现

[size=0.667em]和大多数伟大的思想一样,好的思想最终都会浮出水面。人们发现只需对感知机背后的基本思想停止扩展,就可以克制之前的那些限制。将多个感知机集合到一同,并将数据输入一个(或多个)感知机中,并且以这些感知机的输入作为输入,传递到更多的感知机,最后将输入与希冀值停止比较,这个系统(神经网络)便可以学习更复杂的形式,克制了类的线性不可分的应战,如异或成绩。其中的关键是:如何更新后面各层中的权重?
[size=0.667em]接上去我们暂停一下,将这个过程的一个重要部分方式化。到目前为止,我们曾经讨论了误差和感知机的预测结果与真实结果的偏离程度。测量这个误差是由代价函数损失函数来完成的。正如我们看到的,代价函数量化了对于输入“成绩”(x)网络应该输入的正确答案与实践输入值(y)之间的差距。损失函数则表示网络输入错误答案的次数以及错误总量。公式5-2是代价函数的一个例子,表示真实值与模型预测值之间的误差:



[size=0.667em]公式5-2 真实值与预测值之间的误差

[size=0.667em]训练感知机或者神经网络的目的是最小化一切输入样本数据的代价函数。



[size=0.667em]公式5-3 希望最小化的代价函数

[size=0.667em]接上去大家会看到还有一些其他种类的代价函数,如均方误差,这些通常曾经在神经网络框架中定义好了,大家无须本人去决议哪些是最好的代价函数。需求牢记的是,最终目的是将数据集上的代价函数最小化,这样此处给出的其他概念才有意义。
6.反向传播算法

[size=0.667em]辛顿(Hinton)和他的同事提出一种用多层感知机同时处理一个目的的方法。这个方法可以处理线性不可分成绩。经过该方法,他们可以像拟合线性函数那样去拟合非线性函数。
[size=0.667em]但是如何更新这些不同感知机的权重呢?形成误差的缘由是什么?假设两个感知机彼此相邻,并接收相反的输入,无论怎样处理输入(衔接、求和、相乘),当我们试图将误差传播回到初始权重的时分,它们(输入)都将是输入的函数(两边是相反的),所以它们每一步的更新量都是一样的,感知机不会有不同的结果。这里的多个感知机将是冗余的。它们的权重一样,神经网络也不会学到更多东西。
[size=0.667em]大家再来想象一下,假如将一个感知机作为第二个感知机的输入,是不是更令人困惑了,这到底是在做什么?
[size=0.667em]反向传播可以处理这个成绩,但首先需求稍微调整一下感知机。记住,权重是根据它们对全体误差的贡献来更新的。但是假如权重对应的输入成为另一个感知机的输入,那么从第二个感知机末尾,我们对误差的看法就变得有些模糊了。
[size=0.667em]如图5-6所示,权重w1i经过下一层的权重(w1j)和(w2j)来影响误差,因此我们需求一种方法来计算w1i对误差的贡献,这个方法就是反向传播



[size=0.667em]图5-6 包含隐藏权重的神经网络

[size=0.667em]如今是时分中止运用“感知机”这个术语了,由于之后大家将改变每个神经元权重的更新方式。从这里末尾,我们提到的神经元将更通用也更弱小,它包含了感知机。在很多文献中神经元也被称为单元或节点,在大多数状况下,这些术语是可以互换的。
[size=0.667em]一切类型的神经网络都是由一组神经元和神经元之间的衔接组成的。我们常常把它们组织成层级结构,不过这不是必需的。假如在神经网络的结构中,将一个神经元的输入作为另一个神经元的输入,就意味着出现了隐藏神经元或者隐藏层,而不再只是单纯的输入层、输入层。
[size=0.667em]图5-7中展现的是一个全衔接网络,图中没有展现出一切的衔接,在全衔接网络中,每个输入元素都与下一层的各个神经元相连,每个衔接都有相应的权重。因此,在一个以四维向量为输入、有5个神经元的全衔接神经网络中,一共有20个权重(5个神经元各衔接4个权重)。
[size=0.667em]感知机的每个输入都有一个权重,第二层神经元的权重不是分配给原始输入的,而是分配给来自第一层的各个输入。从这里我们可以看到计算第一层权重对总体误差的影响的难度。第一层权重对误差的影响并不是只来自某个单独权重,而是经过下一层中每个神经元的权重来产生的。虽然反向传播算法本身的推导和数学细节非常风趣,但超出了本书的范围,我们对此只做一个简单的概述,使大家不至于对神经网络这个黑盒一无所知。
[size=0.667em]反向传播是误差反向传播的缩写,描画了如何根据输入、输入和希冀值来更新权重。传播,或者说前向传播,是指输入数据经过网络“向前”活动,并以此计算出输入对应的输入。要停止反向传播,首先需求将感知机的激活函数更改为稍微复杂一点儿的函数。



[size=0.667em]图5-7 全衔接神经网络

[size=0.667em]到目前为止,大家不断在运用阶跃函数作为人工神经元的激活函数。但是接上去会发现,反向传播需求一个非线性延续可微的激活函数[11],如公式5-4中常用的sigmoid函数所示,如今每个神经元都会输入介于两个值(如0和1)之间的值:



[size=0.667em]公式5-4 sigmoid函数




[size=0.667em]



[size=0.667em]为什么激活函数需是非线性的
[size=0.667em]由于需求让神经元可以模拟特征向量和目的变量之间的非线性关系。假如神经元只是将输入与权重相乘然后做加和,那么输入必然是输入的线性函数,这个模型连最简单的非线性关系都无法表示。
[size=0.667em]之前运用的神经元阈值函数是一个非线性阶跃函数。所以实际上只需有足够多的神经元就可以用来训练非线性关系模型。
[size=0.667em]这就是非线性激活函数的优势,它使神经网络可以建立非线性关系模型。一个延续可微的非线性函数,如sigmoid,可以将误差平滑地反向传播到多层神经元上,从而加速训练进程。sigmoid神经元的学习速度很快。


[size=0.667em]还有许多其他的激活函数,如双曲正切函数和修正线性单元函数,它们各有优劣,适用于不同的神经网络结构,大家将在之后的章节中学习。
[size=0.667em]为什么要求可微呢?假如可以计算出这个函数的导数,就能对函数中的各个变量求偏导数。这里的关键是“各个变量”,这样就能经过接收到的输入来更新权重!
7.求导

[size=0.667em]首先用平方误差作为代价函数来计算网络的误差,如公式5-5所示[12]:



[size=0.667em]公式5-5 均方误差

[size=0.667em]然后应用微积分链式法则计算复合函数的导数,如公式5-6所示。网络本身只不过是函数的复合(点积之后的非线性激活函数)。



[size=0.667em]公式5-6 链式法则

[size=0.667em]接上去可以用这个公式计算每个神经元上激活函数的导数。经过这个方法可以计算出各个权重对最终误差的贡献,从而停止适当的调整。
[size=0.667em]假如该层是输入层,借助于可微的激活函数,权重的更新比较简单,对于第j个输入,误差的导数如下[13]:



[size=0.667em]公式5-7 误差导数

[size=0.667em]假如要更新隐藏层的权重,则会稍微复杂一点儿,如公式5-8所示:



[size=0.667em]公式5-8 前一层的导数

[size=0.667em]在公式5-7中,函数f(x)表示实践结果向量,f(x)j表示该向量第j个地位上的值,yiyj是倒数第二层第i个节点和输入第j个节点的输入,衔接这两个节点的权重为wij,误差代价函数对wij求导的结果相当于用α(学习率)乘以前一层的输入再乘当前一层代价函数的导数。公式5-8中δl表示L层第l个节点上的误差项,前一层第j个节点到L层一切的节点停止加权求和[14]。
[size=0.667em]重要的是要明白何时更新权重。在计算每一层中权重的更新时,需求依赖网络在前向传播中的当前形状。一旦计算出误差,我们就可以得到网络中各个权重的更新值,但照旧需求回到网络的起始节点才能去做更新。否则,假如在网络末端更新权重,后面计算的导数将不再是对于本输入的正确的梯度。另外,也可以将权重在每个训练样本上的变化值记录上去,其间不做任何更新,等训练结束后再一同更新,我们将在5.1.6节中讨论这项内容。
[size=0.667em]接上去将全部数据输入网络中停止训练,得到每个输入对应的误差,然后将这些误差反向传播至每个权重,根据误差的总体变化来更新每个权重。当网络处理完全部的训练数据后,误差的反向传播也随之完成,我们将这个过程称为神经网络的一个训练周期(epoch)。我们可以将数据集一遍又一遍地输入网络来优化权重。但是要留意,网络能够会对训练集过拟合,导致对训练集外部的新数据无法做出有效的预测。
[size=0.667em]在公式5-7和公式5-8中,α表示学习率。它决议了在一个训练周期或一批数据中权重中误差的修正量。通常在一个训练周期内α保持不变,但也有一些复杂的训练算法会对α停止自顺应调整,以加快训练速度并确保收敛。假如α过大,很能够会矫枉过正,使下一次误差变得更大,导致权重离目的更远。假如α设置太小会使模型收敛过慢,更蹩脚的是,能够会堕入误差曲面的部分极小值。
[size=0.833em]本文摘自《自然言语处理实战 应用Python了解、分析和生成文本



[size=0.667em]在本书中,读者不只会学习这些系统的外部工作原理,还会学习相关的实际和实际技能,并创建本人的算法或模型。基本计算机迷信概念无缝地转换为方法和实际的坚实基础。从一些久经考验的经典方法(如TF-IDF)末尾,再深化到NLP相关的深层神经网络,作者带领读者对于自然言语处理的核心方法开启了一段明晰的体验之旅。
[size=0.667em]言语是人类建立共识的基础。人们之间交流的不只要理想,还无情感。经过言语,人们获得了阅历范畴之外的知识,并经过分享这些阅历来构建了解的过程。经过本书,大家将会深化了解自然言语处理技术的原理,有朝一日能够创建出能经过言语来了解人类的系统。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评4

no_shadow 2020-10-17 10:10:26 显示全部楼层
分享了
回复

使用道具 举报

heromxs 2020-10-18 13:39:58 来自手机 显示全部楼层
给你我的小心心
回复

使用道具 举报

说谎。 2020-10-19 08:26:33 显示全部楼层
大人,此事必有蹊跷!
回复

使用道具 举报

哟西hgnd 2020-10-19 19:16:23 显示全部楼层
路过
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies