Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mtbookv2
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
mtbookv2
Commits
56a19b44
Commit
56a19b44
authored
4 years ago
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (sec 14)
parent
56b1669c
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
22 行增加
和
19 行删除
+22
-19
Chapter14/Figures/figure-iteration.tex
+10
-10
Chapter14/Figures/figure-mask-predict.tex
+5
-2
Chapter14/Figures/figure-reranking.tex
+1
-1
Chapter14/chapter14.tex
+6
-6
没有找到文件。
Chapter14/Figures/figure-iteration.tex
查看文件 @
56a19b44
...
@@ -11,29 +11,29 @@
...
@@ -11,29 +11,29 @@
\node
(point)[right of=decoder
_
2,xshift=2.5cm,]
{
\LARGE
{
...
}}
;
\node
(point)[right of=decoder
_
2,xshift=2.5cm,]
{
\LARGE
{
...
}}
;
\node
(decoder
_
3)[er,thick,draw,right of=point,xshift=2.5cm,fill=red!20]
{
\Large
{
解码器
}}
;
\node
(decoder
_
3)[er,thick,draw,right of=point,xshift=2.5cm,fill=red!20]
{
\Large
{
解码器
}}
;
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]encoder.east) -- ([xshift=-0.2cm]decoder
_
1.west);
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]encoder.east) -- ([xshift=-0.2cm]decoder
_
1.west);
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]decoder
_
1.east) -- ([xshift=-0.2cm]decoder
_
2.west);
%
\draw [->,very thick,draw=black!70]([xshift=0.2cm]decoder_1.east) -- ([xshift=-0.2cm]decoder_2.west);
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]decoder
_
2.east) -- ([xshift=-0.1cm]point.west);
%
\draw [->,very thick,draw=black!70]([xshift=0.2cm]decoder_2.east) -- ([xshift=-0.1cm]point.west);
\draw
[->,very thick,draw=black!70]([xshift=0.1cm]point.east) -- ([xshift=-0.2cm]decoder
_
3.west);
%
\draw [->,very thick,draw=black!70]([xshift=0.1cm]point.east) -- ([xshift=-0.2cm]decoder_3.west);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]encoder.south) -- ([xshift=0,yshift=-0.2cm]encoder.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]encoder.south) -- ([xshift=0,yshift=-0.2cm]encoder.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]encoder.north) -- ([xshift=0,yshift=1cm]encoder.north);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]encoder.north) -- ([xshift=0,yshift=1cm]encoder.north);
\node
[below of = encoder,xshift=0cm,yshift=2.2cm]
{
预测目标长度
}
;
\node
[below of = encoder,xshift=0cm,yshift=2.2cm]
{
预测目标长度
}
;
\node
[below of = encoder,xshift=0cm,yshift=-2.2cm]
{
\Large
$
x
$}
;
\node
[below of = encoder,xshift=0cm,yshift=-2.2cm]
{
\Large
$
\seq
{
x
}
$}
;
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]decoder
_
1.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
1.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]decoder
_
1.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
1.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
1.north) -- ([xshift=0,yshift=1cm]decoder
_
1.north);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
1.north) -- ([xshift=0,yshift=1cm]decoder
_
1.north);
\node
[below of = decoder
_
1,xshift=0cm,yshift=-2.2cm]
{
\Large
$
x'
$}
;
\node
[below of = decoder
_
1,xshift=0cm,yshift=-2.2cm]
{
\Large
$
\seq
{
x'
}
$}
;
\node
(line1
_
1)[below of = decoder
_
1,xshift=0cm,yshift=2.2cm]
{
\Large
$
y'
$}
;
\node
(line1
_
1)[below of = decoder
_
1,xshift=0cm,yshift=2.2cm]
{
\Large
$
\seq
{
y
}^{
[
1
]
}
$}
;
\draw
[->,thick,]([xshift=0,yshift=-1cm]decoder
_
2.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
2.south);
\draw
[->,thick,]([xshift=0,yshift=-1cm]decoder
_
2.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
2.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
2.north) -- ([xshift=0,yshift=1cm]decoder
_
2.north);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
2.north) -- ([xshift=0,yshift=1cm]decoder
_
2.north);
\node
(line1
_
2)[below of = decoder
_
2,xshift=0cm,yshift=-2.2cm]
{
\Large
$
y'
$}
;
\node
(line1
_
2)[below of = decoder
_
2,xshift=0cm,yshift=-2.2cm]
{
\Large
$
\seq
{
y
}^{
[
1
]
}
$}
;
\node
[below of = decoder
_
2,xshift=0cm,yshift=2.2cm]
{
\Large
$
y''
$}
;
\node
[below of = decoder
_
2,xshift=0cm,yshift=2.2cm]
{
\Large
$
\seq
{
y
}^{
[
2
]
}
$}
;
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]decoder
_
3.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
3.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=-1cm]decoder
_
3.south) -- ([xshift=0,yshift=-0.2cm]decoder
_
3.south);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
3.north) -- ([xshift=0,yshift=1cm]decoder
_
3.north);
\draw
[->,very thick,draw=black!70]([xshift=0,yshift=0.2cm]decoder
_
3.north) -- ([xshift=0,yshift=1cm]decoder
_
3.north);
\node
(line3
_
2)[below of = decoder
_
3,xshift=0cm,yshift=-2.2cm]
{
\Large
$
y
^{
N
-
1
}$}
;
\node
(line3
_
2)[below of = decoder
_
3,xshift=0cm,yshift=-2.2cm]
{
\Large
$
\seq
{
y
}^{
[
N
-
1
]
}$}
;
\node
[below of = decoder
_
3,xshift=0cm,yshift=2.2cm]
{
\Large
$
y
^
N
$}
;
\node
[below of = decoder
_
3,xshift=0cm,yshift=2.2cm]
{
\Large
$
\seq
{
y
}^{
[
N
]
}
$}
;
\draw
[->,very thick,draw=black!70, out=0, in=180,dotted]
(line1
_
1.east) to (line1
_
2.west);
\draw
[->,very thick,draw=black!70, out=0, in=180,dotted]
(line1
_
1.east) to (line1
_
2.west);
\draw
[->,very thick,draw=black!70, out=0, in=180,dotted]
([xshift=4cm]line1
_
1.east) to ([xshift=3cm]line1
_
2.west);
\draw
[->,very thick,draw=black!70, out=0, in=180,dotted]
([xshift=4cm]line1
_
1.east) to ([xshift=3cm]line1
_
2.west);
...
...
This diff is collapsed.
Click to expand it.
Chapter14/Figures/figure-mask-predict.tex
查看文件 @
56a19b44
...
@@ -5,8 +5,11 @@
...
@@ -5,8 +5,11 @@
\node
(encoder)[er,thick,minimum width=5.5cm,fill=ugreen!20]
{
\huge
{
编码器
}}
;
\node
(encoder)[er,thick,minimum width=5.5cm,fill=ugreen!20]
{
\huge
{
编码器
}}
;
\node
(decoder)[er,thick,right of=encoder,xshift=7.75cm,fill=red!20]
{
\huge
{
解码器
}}
;
\node
(decoder)[er,thick,right of=encoder,xshift=7.75cm,fill=red!20]
{
\huge
{
解码器
}}
;
\node
(decoder
_
1)[er,thick,right of=decoder,xshift=8.75cm,fill=red!20]
{
\huge
{
解码器
}}
;
\node
(decoder
_
1)[er,thick,right of=decoder,xshift=8.75cm,fill=red!20]
{
\huge
{
解码器
}}
;
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]encoder.east) -- ([xshift=-0.2cm]decoder.west);
\draw
[->,very thick,draw=blue!70]([xshift=0.2cm]encoder.east) -- ([xshift=-0.2cm]decoder.west);
\draw
[->,very thick,draw=black!70]([xshift=0.2cm]decoder.east) -- ([xshift=-0.2cm]decoder
_
1.west);
\begin{pgfonlayer}
{
background
}
\draw
[->,very thick,draw=blue!70]([xshift=0.2cm,yshift=-0.8em]encoder.east) -- ([xshift=-0.2cm,yshift=-0.8em]decoder
_
1.west);
\end{pgfonlayer}
\foreach
\x
in
{
-2.2cm,-1.1cm,...,2.2cm
}
\foreach
\x
in
{
-2.2cm,-1.1cm,...,2.2cm
}
\draw
[->,very thick,draw=black!70]([xshift=
\x
,yshift=-1cm]encoder.south) -- ([xshift=
\x
,yshift=-0.2cm]encoder.south);
\draw
[->,very thick,draw=black!70]([xshift=
\x
,yshift=-1cm]encoder.south) -- ([xshift=
\x
,yshift=-0.2cm]encoder.south);
...
...
This diff is collapsed.
Click to expand it.
Chapter14/Figures/figure-reranking.tex
查看文件 @
56a19b44
...
@@ -34,7 +34,7 @@
...
@@ -34,7 +34,7 @@
\node
[anchor=south,font=\scriptsize,align=center]
(w5) at ([yshift=1.6em]box3.north)
{
\tiny\bfnew
{
对
\
这个
\
问题
\
存在
\
不同的
\
看法
}}
;
\node
[anchor=south,font=\scriptsize,align=center]
(w5) at ([yshift=1.6em]box3.north)
{
\tiny\bfnew
{
对
\
这个
\
问题
\
存在
\
不同的
\
看法
}}
;
\node
[font=\tiny]
at ([xshift=-0.8em,yshift=-0.6em]encoder.east)
{$
N
\times
$}
;
\node
[font=\tiny]
at ([xshift=-0.8em,yshift=-0.6em]encoder.east)
{$
N
\times
$}
;
\node
[font=\tiny]
at ([xshift=-0.8em,yshift=-0.6em]decoder.east)
{$
1
\times
$}
;
\node
[font=\tiny]
at ([xshift=-0.8em,yshift=-0.6em]decoder.east)
{$
1
\times
$}
;
\node
[font=\tiny]
at ([xshift=-1em,yshift=-0.6em]decoder2.east)
{$
N
$
-1
$
\times
$}
;
\node
[font=\tiny]
at ([xshift=-1em,yshift=-0.6em]decoder2.east)
{$
N
-
1
\times
$}
;
\draw
[line]
(w1.north) -- (box1.south);
\draw
[line]
(w1.north) -- (box1.south);
\draw
[line]
(w2.north) -- (box2.south);
\draw
[line]
(w2.north) -- (box2.south);
...
...
This diff is collapsed.
Click to expand it.
Chapter14/chapter14.tex
查看文件 @
56a19b44
...
@@ -514,9 +514,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -514,9 +514,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
引入自回归模块
}
\subsection
{
引入自回归模块
}
\parinterval
非自回归翻译消除了序列生成过程中不同位置预测结果间的依赖,在每个位置都进行独立的预测,但这反而会导致翻译质量显著下降,因为缺乏不同单词间依赖关系的建模。因此,也有研究聚焦于在非自回归模型中添加一些自回归组件
来提升网络结构的表达能力
。
\parinterval
非自回归翻译消除了序列生成过程中不同位置预测结果间的依赖,在每个位置都进行独立的预测,但这反而会导致翻译质量显著下降,因为缺乏不同单词间依赖关系的建模。因此,也有研究聚焦于在非自回归模型中添加一些自回归组件。
\parinterval
一种做法是将句法信息作为目标语言句子的框架
\upcite
{
Akoury2019SyntacticallyST
}
。具体来说,先自回归地预测出一个目标语言的句法块序列,将句法块作为序列信息的抽象,然后根据句法块序列非自回归地生成所有目标语言单词。如图
\ref
{
fig:14-21
}
所示,该模型由一个编码器和两个解码器组成。其中编码器和第一个解码器与标准的Transformer模型相同,用来自回归地预测句法树信息;第二个解码器将第一个解码器的句法信息作为输入,之后再非自回归地生成整个译文。在训练过程中,通过使用外部句法分析器获得对句法预测任务的监督信号。虽然可以简单地让模型预测整个句法树,但是这种方法会显著增加自回归步骤的数量,从而增大时间开销。因此,为了维持句法信息与解码时间的平衡,这里预测一些由句法标记和子树大小组成的块标识符(如VP3)而不是整个句法树。
\parinterval
一种做法是将句法信息作为目标语言句子的框架
\upcite
{
Akoury2019SyntacticallyST
}
。具体来说,先自回归地预测出一个目标语言的句法块序列,将句法块作为序列信息的抽象,然后根据句法块序列非自回归地生成所有目标语言单词。如图
\ref
{
fig:14-21
}
所示,该模型由一个编码器和两个解码器组成。其中编码器和第一个解码器与标准的Transformer模型相同,用来自回归地预测句法树信息;第二个解码器将第一个解码器的句法信息作为输入,之后再非自回归地生成整个译文。在训练过程中,通过使用外部句法分析器获得对句法预测任务的监督信号。虽然可以简单地让模型预测整个句法树,但是这种方法会显著增加自回归步骤的数量,从而增大时间开销。因此,为了维持句法信息与解码时间的平衡,这里预测一些由句法标记和子树大小组成的块标识符(如VP3)而不是整个句法树。
关于基于句法的神经机器翻译模型在
{
\chapterfifteen
}
还会有进一步讨论。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
@@ -527,7 +527,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -527,7 +527,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\end{figure}
\end{figure}
%----------------------------------------------
%----------------------------------------------
\parinterval
另一种做法是半自回归地生成译文
\upcite
{
Wang2018SemiAutoregressiveNM
}
。如图
\ref
{
fig:14-20
}
所示,自回归模型从左到右依次生成译文,具有“最强”的自回归性;而非自回归模型完全独立的生成每个译文单词,具有“最弱”的自回归性;半自回归模型则是将整个译文分成
$
k
$
个块,在块内执行非自回归解码,在块间则执行自回归的解码,能够在每个时间步并行产生多个连续的单词。通过调整块的大小,半自回归模型可以灵活的调整
到自回归模型(当
$
k
$
等于1)和非自回归模型(当
$
k
$
大于等于最大的译文长度)上来
。
\parinterval
另一种做法是半自回归地生成译文
\upcite
{
Wang2018SemiAutoregressiveNM
}
。如图
\ref
{
fig:14-20
}
所示,自回归模型从左到右依次生成译文,具有“最强”的自回归性;而非自回归模型完全独立的生成每个译文单词,具有“最弱”的自回归性;半自回归模型则是将整个译文分成
$
k
$
个块,在块内执行非自回归解码,在块间则执行自回归的解码,能够在每个时间步并行产生多个连续的单词。通过调整块的大小,半自回归模型可以灵活的调整
为自回归翻译(当
$
k
$
等于1)和非自回归翻译(当
$
k
$
大于等于最大的译文长度)
。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
@@ -557,7 +557,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -557,7 +557,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval
如果一次并行生成整个序列,往往很难捕捉单词之间的关系,而且即便生成了错误的译文单词,这类方法也无法修改。针对这些问题,也可以使用迭代式的生成方式
\upcite
{
Lee2018DeterministicNN,Ghazvininejad2019MaskPredictPD,Kasai2020NonAutoregressiveMT
}
。这种方法放弃了一次生成最终的译文句子,而是将解码出的译文再重新送给解码器,在每次迭代中来改进之前生成的译文单词,可以理解为句子级的自回归模型。这样做的好处在于,每次迭代的过程中可以利用已经生成的部分翻译结果,来指导其它部分的生成。
\parinterval
如果一次并行生成整个序列,往往很难捕捉单词之间的关系,而且即便生成了错误的译文单词,这类方法也无法修改。针对这些问题,也可以使用迭代式的生成方式
\upcite
{
Lee2018DeterministicNN,Ghazvininejad2019MaskPredictPD,Kasai2020NonAutoregressiveMT
}
。这种方法放弃了一次生成最终的译文句子,而是将解码出的译文再重新送给解码器,在每次迭代中来改进之前生成的译文单词,可以理解为句子级的自回归模型。这样做的好处在于,每次迭代的过程中可以利用已经生成的部分翻译结果,来指导其它部分的生成。
\parinterval
图
\ref
{
fig:14-18
}
展示了这种方法的简单示例。它拥有一个编码器和
$
N
$
个解码器。编码器首先预测出译文的长度,然后将输入
$
\seq
{
x
}$
按照长度复制出
$
\seq
{
x'
}$
作为第一个解码器的输入,之后生成
$
\seq
{
y
'
}$
作为第一轮迭代的输出。接下来再把
$
\seq
{
y'
}$
输入给第二个解码器输出
$
\seq
{
y''
}$
,以此类推。那么迭代到什么时候结束呢?一种简单的做法是提前制定好迭代次数,这种方法能够自主地对生成句子的质量和效率进行平衡。另一种称之为“自适应”的方法,具体是通过计算当前生成的句子与上一次生成句子之间的变化量来判断是否停止,例如,使用杰卡德相似系数作为变化量函数
\footnote
{
杰卡德相似系数是衡量有限样本集之间的相似性与差异性的一种指标,杰卡德相似系数值越大,样本相似度越高。
}
。另外,需要说明的是,图
\ref
{
fig:14-18
}
中是使用多个解码器的一种逻辑示意。真实的系统仅需要一个解码器,并运行多次,就达到了迭代精化的目的。
\parinterval
图
\ref
{
fig:14-18
}
展示了这种方法的简单示例。它拥有一个编码器和
$
N
$
个解码器。编码器首先预测出译文的长度,然后将输入
$
\seq
{
x
}$
按照长度复制出
$
\seq
{
x'
}$
作为第一个解码器的输入,之后生成
$
\seq
{
y
}^{
[
1
]
}$
作为第一轮迭代的输出。接下来再把
$
\seq
{
y
}^{
[
1
]
}$
输入给第二个解码器,然后输出
$
\seq
{
y
}^{
[
2
]
}$
,以此类推。那么迭代到什么时候结束呢?一种简单的做法是提前制定好迭代次数,这种方法能够自主地对生成句子的质量和效率进行平衡。另一种称之为“自适应”的方法,具体是通过计算当前生成的句子与上一次生成句子之间的变化量来判断是否停止,例如,使用杰卡德相似系数作为变化量函数
\footnote
{
杰卡德相似系数是衡量有限样本集之间的相似性与差异性的一种指标,杰卡德相似系数值越大,样本相似度越高。
}
。另外,需要说明的是,图
\ref
{
fig:14-18
}
中是使用多个解码器的一种逻辑示意。真实的系统仅需要一个解码器,并运行多次,就达到了迭代精化的目的。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
@@ -568,9 +568,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -568,9 +568,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\end{figure}
\end{figure}
%----------------------------------------------
%----------------------------------------------
\parinterval
除了使用上一个步骤的输出,当前解码器的输入还
使用了添加噪声的正确目标语言句子,两种使用情况之间使用一个超参数控制
\upcite
{
Lee2018DeterministicNN
}
。另外,对于译文长度的预测,也可以使用编码器的输出单独训练
一个独立的长度预测模块,这种方法也推广到了目前大多数模型上。
\parinterval
除了使用上一个步骤的输出,当前解码器的输入还
可以使用了添加噪声的正确目标语言句子
\upcite
{
Lee2018DeterministicNN
}
。另外,对于译文长度的预测,也可以使用编码器的输出单独训练
一个独立的长度预测模块,这种方法也推广到了目前大多数模型上。
\parinterval
另一种方法借鉴了BERT的思想
\upcite
{
devlin2019bert
}
,称为Mask-Predict
\upcite
{
Ghazvininejad2019MaskPredictPD
}
。类似于BERT中的<CLS>
,该方法在源语言句子的最前面加上了一个特殊符号<LEN>作为输入,用来预测目标句的长度
$
n
$
。之后,将特殊符<Mask>(与BERT中的<Mask>有相似的含义)复制
$
n
$
次作为解码器的输入,然后用非自回归的方式生成目标端所有的词。这样生成的翻译可能是比较差的,因此可以将第一次生成的这些词中不确定(即生成概率比较低)的一些词再“擦”掉,依据目标端剩余的
单词以及源语言句子重新进行预测,不断迭代,直到满足停止条件为止。图
\ref
{
fig:14-19
}
给出了一个示例。
\parinterval
另一种方法借鉴了BERT的思想
\upcite
{
devlin2019bert
}
,称为Mask-Predict
\upcite
{
Ghazvininejad2019MaskPredictPD
}
。类似于BERT中的<CLS>
标记,该方法在源语言句子的最前面加上了一个特殊符号<LEN>作为输入,用来预测目标句的长度
$
n
$
。之后,将特殊符<Mask>(与BERT中的<Mask>有相似的含义)复制
$
n
$
次作为解码器的输入,然后用非自回归的方式生成所有的译文单词。这样生成的翻译可能是比较差的,因此可以将第一次生成的这些词中不确定(即生成概率比较低)的一些词“擦”掉,依据剩余的译文
单词以及源语言句子重新进行预测,不断迭代,直到满足停止条件为止。图
\ref
{
fig:14-19
}
给出了一个示例。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论