• 可微神经计算机的介绍

    • 一、介绍
    • 二、控制器
    • 三、控制信息向量
    • 四、存储器读写机制
      • 写操作
      • 读操作
      • 4.1 Content-based addressing
      • 4.2 Dynamic memory allocation
      • Write weight
      • 4.3 Temporal memory linkage
      • Read weighting

可微神经计算机的介绍

一、介绍

如今,人工神经网络已经在模式识别、序列学习和强化学习方面表现出色,但因为没有额外的存储机制,使得在表示变量和需要存储长时间数据的情况下,神经网络的能力被有所限制。本文将基于Deepmind于2016年发表在《自然》杂志上的文章,对文章中所提出的可微神经计算机(Differentiable neural computer)进行一定的介绍,并针对Deepmind开源在Github上的代码进行一定的分析。

可微神经计算机(之后简称DNC)的一个单元(cell)主要由一个控制器和一个存储器构成,如图所示:


其中,控制器可以是人工神经网络,也可以是其他的机器学习模型;存储器可以理解为由读写头、内存单元和一些保存存储状态的单元组成。下面介绍控制器、存储器和两者之间的数据交互。

在介绍DNC单元之前,本节将补充一点我在实现代码过程中的一点经验。在构造一个复杂的变量之前,我们需要考虑该变量的以下几个方面:
变量类型(e.g. float32, int64),
变量形状(e.g. [batch_size, time, length]),
变量范围(e.g. α∈[0,1]α∈[0,1]\alpha \in [0, 1]),
变量之间关系(e.g. ∑ni=0αi⩽1∑i=0nαi⩽1\sum_{i=0}^{n} \alpha_{i}\leqslant 1 ) 。

二、控制器

论文上所用的控制器结构是一个变体的LSTM,在此简称 ηη\eta 。

在某一时刻 t ,ηη\eta 获得一个输入向量 xt∈ℝXxt∈RXx_{t} \in \mathbb{R}^{X} 。另外,在t-1时刻,存储器从存储单元 Mt−1∈ℝN×WMt−1∈RN×WM_{t-1} \in \mathbb{R}^{N \times W} 中读取 RRR 个向量: rt−11,...,rt−1R" role="presentation">r1t−1,...,rRt−1rt−11,...,rt−1Rr_{t-1}^{1}, ..., r_{t-1}^{R} ,其中 rit−1∈ℝWrt−1i∈RWr_{t-1}^{i} \in \mathbb{R}^{W} 。这样将向量 xtxtx_{t} 与 RRR 个读出的向量做连接(concatenate)操作,得控制器η" role="presentation">ηη\eta在t时刻的输入为

χt=[xt;r1t−1;...;rRt−1]χt=[xt;rt−11;...;rt−1R]\chi _{t} = [x_t; r_{t-1}^{1}; ...; r_{t-1}^{R}] 。
那么,对于有1个隐藏层的lstm网络(而论文中叙述的是一个多层lstm),隐藏层的输入门为: it=σ(Wi[χt;ht−1]+bi)it=σ(Wi[χt;ht−1]+bi)i_{t} = \sigma(W_{i}[\chi_{t}; h_{t-1}] + b_{i}) ;
遗忘门为:
ft=σ(Wf[χt;ht−1]+bf)ft=σ(Wf[χt;ht−1]+bf)f_{t} = \sigma(W_{f}[\chi_{t}; h_{t-1}] + b_{f}) ;
状态更新:
st=ftst−1+ittanh(Ws[χt;ht−1]+bs)st=ftst−1+ittanh(Ws[χt;ht−1]+bs)s_{t} = f_{t}s_{t-1} + i_{t}tanh(W_{s}[\chi_{t}; h_{t-1}] + b_{s}) ;
输出门为:
ot=σ(Wo[χt;ht−1]+bo)ot=σ(Wo[χt;ht−1]+bo)o_{t} = \sigma(W_{o}[\chi_{t}; h_{t-1}] + b_{o}) ;
最后隐藏层输出:
ht=ottanh(st)ht=ottanh(st)h_{t} = o_{t}tanh(s_{t}) 。

论文要求,
在t时刻,控制网络 ηη\eta 需要产生输出向量 ϑt∈ℝYϑt∈RY\vartheta_{t} \in \mathbb{R}^{Y},并产生控制信息向量 ξt∈ℝWR+3W+5R+3ξt∈RWR+3W+5R+3\xi_{t} \in \mathbb{R}^{WR+3W+5R+3} ,定义如下:

ϑt=Wϑhtϑt=Wϑht\vartheta_{t} = W_{\vartheta}h_{t} ;
ξt=Wξhtξt=Wξht\xi_{t} = W_{\xi}h_{t} 。

最后, ηη\eta 产生一个输出向量 yt∈ℝYyt∈RYy_{t} \in \mathbb{R}^{Y} ,即目标向量 zt∈ℝYzt∈RYz_{t} \in \mathbb{R}^{Y} 的预测向量(对于监督学习),ηη\eta 的输出向量 ytyty_{t} 定义如下:

yt=ϑt+Wr[r1t;...;rRt]yt=ϑt+Wr[rt1;...;rtR]y_{t} = \vartheta_{t} + W_{r}[r_{t}^{1}; ...; r_{t}^{R}]

三、控制信息向量

对控制信息向量ξt∈ℝWR+3W+5R+3ξt∈RWR+3W+5R+3\xi_{t} \in \mathbb{R}^{WR+3W+5R+3} 进行细分(subdivid),得到如下控制信息:

ξt=[kr,1t;...;kr,Rt;βr,1t^;...;βr,Rt^;kwt;βwt^;et^;vt;f1t^;...;fRt^;gat^;gwt^;π1t^;...;πRt^]ξt=[ktr,1;...;ktr,R;βtr,1^;...;βtr,R^;ktw;βtw^;et^;vt;ft1^;...;ftR^;gta^;gtw^;πt1^;...;πtR^]\xi_{t} = [k_{t}^{r,1}; ...; k_{t}^{r,R}; \hat {\beta_{t}^{r,1}}; ...; \hat {\beta_{t}^{r,R}}; k_{t}^{w}; \hat {\beta_{t}^{w}}; \hat {e_{t}}; v_{t}; \hat {f_{t}^{1}}; ...; \hat {f_{t}^{R}}; \hat {g_{t}^{a}}; \hat {g_{t}^{w}}; \hat {\pi_{t}^{1}}; ...; \hat {\pi_{t}^{R}}]

在介绍控制信息之前,本节需要引入一个变量空间 SNSNS_{N},定义如下:

SN={α∈ℝN:α∈[0,1],∑Ni=1αi=1}SN={α∈RN:α∈[0,1],∑i=1Nαi=1}S_{N} = \left \{ \alpha \in \mathbb {R}^{N}: \alpha \in [0, 1], \sum_{i=1}^{N} \alpha_{i} = 1 \right \}

对于读写一块内存矩阵M∈ℝN×WM∈RN×W M \in \mathbb{R}^{N \times W} ,存储器需要很多控制信息,论文要求有10种控制信息,这10种信息主要分两类:控制写与控制读,定义如下:

R read keys:

{kr,it∈ℝW;1⩽i⩽R}{ktr,i∈RW;1⩽i⩽R}\left \{ k_{t}^{r, i} \in \mathbb {R}^{W}; 1 \leqslant i \leqslant R \right \}

R read strengths:

{βr,it=oneplus(βr,it^)∈[1,∞];1⩽i⩽R}{βtr,i=oneplus(βtr,i^)∈[1,∞];1⩽i⩽R}\left \{ \beta_{t}^{r, i} = oneplus(\hat {\beta_{t}^{r,i}}) \in [1, \infty]; 1 \leqslant i \leqslant R \right \}

R free gates:

{fit=σ(fit^)∈[0,1];1⩽i⩽R}{fti=σ(fti^)∈[0,1];1⩽i⩽R}\left \{ f_{t}^{i} = \sigma (\hat {f_{t}^{i}}) \in [0, 1]; 1 \leqslant i \leqslant R \right \}

R read modes:

{πit=softmax(πit^)∈S3;1⩽i⩽R}{πti=softmax(πti^)∈S3;1⩽i⩽R}\left \{ \pi_{t}^{i} = softmax (\hat {\pi_{t}^{i}}) \in S_{3} ; 1 \leqslant i \leqslant R \right \}

the write key:

kwt∈ℝWktw∈RWk_{t}^{w} \in \mathbb {R}^{W}

the write strength:

βwt=oneplus(βw^)∈[1,∞]βtw=oneplus(βw^)∈[1,∞] \beta_{t}^{w} = oneplus(\hat {\beta_{w}}) \in [1, \infty]

the erase vector:

et=σ(et^)∈[0,1]Wet=σ(et^)∈[0,1]We_{t} = \sigma (\hat {e_{t}}) \in [0, 1]^{W}

the write vector:

vt∈ℝWvt∈RWv_{t} \in \mathbb {R}^{W}

the allocation gate:

gat=σ(gat^)∈[0,1]gta=σ(gta^)∈[0,1]g_{t}^{a} = \sigma (\hat {g_{t}^{a}}) \in [0, 1]

the write gate:

gwt=σ(gwt^)∈[0,1]gtw=σ(gtw^)∈[0,1]g_{t}^{w} = \sigma (\hat {g_{t}^{w}}) \in [0, 1]

对于上述控制信息的使用,将在下面的部分介绍。

四、存储器读写机制

论文规定,DNC单元在将向量写入内存矩阵 MN×WtMtN×WM_{t}^{N \times W} 时,利用 content-base addressing 和 dynamic memory allocation 两种寻址方式的组合,以确定哪些内存空间是可以写入的。DNC单元在从内存单元 MN×WtMtN×WM_{t}^{N \times W} 读取向量时,利用 content-base addressing 和 temporal memory linkage 两种寻址方式的组合,以确定哪些内存空间是需要读出的。由此可知,共有3种寻址方式被利用进行读写,下面的部分将分别介绍这3种寻址机制,并解释如何写入和读取内存单元。

在介绍3中寻址机制之前,本节需要引入另一个变量空间ΔNΔN\Delta N,定义如下:

ΔN={α∈ℝN:αi∈[0,1],∑Ni=1αi⩽1}ΔN={α∈RN:αi∈[0,1],∑i=1Nαi⩽1}\Delta N = \left \{ \alpha \in \mathbb {R}^{N}: \alpha_{i} \in [0, 1], \sum _{i=1}^{N} \alpha_{i} \leqslant 1 \right \}

写操作

写操作,利用一个write weighting wwt∈ΔNwtw∈ΔNw_{t}^{w} \in \Delta N,并通过控制信息中的the erase vector: et=σ(et^)∈[0,1]Wet=σ(et^)∈[0,1]We_{t} = \sigma (\hat {e_{t}}) \in [0, 1]^{W} 和 the write vector: vt∈ℝWvt∈RWv_{t} \in \mathbb {R}^{W} 对内存矩阵进行操作,操作如下:

Mt=Mt−1⊙(E−wwtet)+wwtvtMt=Mt−1⊙(E−wtwet)+wtwvtM_{t} = M_{t-1} \odot (E - w_{t}^{w}e_{t}) + w_{t}^{w}v_{t}

其中,write weighting wwt∈ΔNwtw∈ΔNw_{t}^{w} \in \Delta N 将在通过下文所述的寻址机制进行获取。

读操作

论文规定,利用R个read weighting {wr,1t,...,wr,Rt},wr,it∈ΔN{wtr,1,...,wtr,R},wtr,i∈ΔN\left \{w_{t}^{r, 1}, ..., w_{t}^{r, R}\right \}, w_{t}^{r, i} \in \Delta N 从内存矩阵中读出R个read vector {r1t,...,rRt},rit∈RW{rt1,...,rtR},rti∈RW\left \{ r_{t}^{1}, ... , r_{t}^{R} \right \}, r_{t}^{i} \in R^{W},操作如下:

rit=MTtwr,itrti=MtTwtr,ir_{t}^{i} = M_{t}^{T}w_{t}^{r,i}

其中,R个read weighting {wr,1t,...,wr,Rt},wr,it∈ΔN{wtr,1,...,wtr,R},wtr,i∈ΔN\left \{w_{t}^{r, 1}, ..., w_{t}^{r, R}\right \}, w_{t}^{r, i} \in \Delta N 将在通过下文所述的寻址机制进行获取。

4.1 Content-based addressing

Content-based addressing 机制可以理解为一种attention机制。论文规定,对于内存矩阵M∈ℝN×WM∈RN×WM \in \mathbb{R}^{N \times W} 中的第i个内存单元 M[i]∈ℝ1×WM[i]∈R1×WM[i] \in \mathbb {R}^{1 \times W} 在read 或 write 时所分配的比重 C(M,k,β)[i]C(M,k,β)[i]C(M, k, \beta)[i] 定义如下:

C(M,k,β)[i]=exp{D(k,M[i,:])β}∑jexp{D(k,M[j,:])β}C(M,k,β)[i]=exp{D(k,M[i,:])β}∑jexp{D(k,M[j,:])β}C(M, k, \beta)[i] = \frac{exp \left \{ D(k, M[i, :])\beta \right \}} {\sum_{j} exp \left \{D(k, M[j, :]) \beta \right \}}

其中,函数D(u,v)D(u,v) D(u, v) 是求两个向量之间的余弦值,以余弦值来衡量两个向量之间的相关程度,定义如下:

D(u,v)=u⋅v|u||v|D(u,v)=u⋅v|u||v|D(u, v) = \frac {u \cdot v} {|u||v|}

由以上定义可知,C(M,k,β)∈SNC(M,k,β)∈SNC(M, k, \beta) \in S_{N} 确定了read head 和 write head 在内存矩阵M∈ℝN×WM∈RN×WM \in \mathbb{R}^{N \times W} 上对各个内存单元 M[i]∈ℝ1×WM[i]∈R1×WM[i] \in \mathbb {R}^{1 \times W} 的读写比重。

4.2 Dynamic memory allocation

在某些情况下,我们需要对内存矩阵 MN×WtMtN×WM_{t}^{N \times W} 中的某些内存单元进行释放并重新分配,所以论文加入Dynamic memory allocation 机制。

存储器用 ut∈[0,1]Nut∈[0,1]Nu_{t} \in [0, 1]^{N} 表示在t时刻内存单元的使用情况,并定义开始时刻u0=0u0=0u_{0} = 0。存储器在写入向量之前,需要确定哪些内存单元是可以被覆盖掉的,这就需要一个链表 free list 来表示覆写内存单元的顺序。存储器用 ψt∈[0,1]Nψt∈[0,1]N\psi_{t} \in [0, 1]^{N} 表示每个内存单元将被保留多少,定义如下:

ψt=∏Ri=1(1−fitwr,it−1)ψt=∏i=1R(1−ftiwt−1r,i)\psi_{t} = \prod_{i = 1}^{R}(1-f_{t}^{i}w_{t-1}^{r,i})

则 ututu_{t} 可以被定义如下:

ut=(ut−1+wwt−1⋅(1−ut−1))⋅ψtut=(ut−1+wt−1w⋅(1−ut−1))⋅ψtu_{t} = (u_{t-1} + w_{t-1}^{w} \cdot (1-u_{t-1})) \cdot \psi_{t}

之后,对ututu_{t} 进行升序排列,将排序后的索引所形成的排列作为 free list ϕt∈ℤNϕt∈ZN\phi_{t} \in \mathbb {Z}^{N} 。

这样,在t时刻,在Dynamic memory allocation 机制中,各个内存单元的写入权重the allocation weighting at∈ΔNat∈ΔNa_{t} \in \Delta N ,可以定义为:

at[ϕt[j]]=(1−ut[ϕt[j]])∏j−1i=1ut[ϕt[i]]at[ϕt[j]]=(1−ut[ϕt[j]])∏i=1j−1ut[ϕt[i]]a_{t} [\phi_{t}[j]] = (1 - u_{t}[\phi_{t}[j]])\prod_{i = 1}^{j-1}u_{t}[\phi_{t}[i]]

Write weight

综上所述,论文将各个内存单元在t时刻的写入权重wwt∈ΔNwtw∈ΔNw_{t}^{w} \in \Delta N定义如下:

wwt=gwt[gatat+(1−gat)cwt]wtw=gtw[gtaat+(1−gta)ctw]w_{t}^{w} = g_{t}^{w} [g_{t}^{a}a_{t} + (1 - g_{t}^{a})c_{t}^{w}]

其中,cwt=C(Mt−1,kwt,βwt)∈SNctw=C(Mt−1,ktw,βtw)∈SNc_{t}^{w} = C(M_{t-1}, k_{t}^{w}, \beta_{t}^{w}) \in S_{N} 是Content-based addressing 机制中的各个内存单元在t时刻的写入权重;at∈ΔNat∈ΔNa_{t} \in \Delta N 是Dynamic memory allocation 机制中各个内存单元在t时刻的写入权重,这两种机制的组合形成整个存储器的在t时刻对各个内存单元的写入权重wwtwtww_{t}^{w} 。

4.3 Temporal memory linkage

有时,用户希望网络能够将写入内存的内容按照一定的顺序读出来,于是论文设计了Temporal memory linkage机制。

这种机制拥有一个存储写入顺序的单元Lt∈[0,1]N×NLt∈[0,1]N×NL_{t} \in [0, 1]^{N \times N},其中 Lt[i,j]Lt[i,j]L_{t}[i, j] 表示在写入第j个内存单元之后写入第i个内存单元的权重(degree),Lt[i,:]∈ΔNLt[i,:]∈ΔNL_{t}[i, :] \in \Delta N ,Lt[:,j]∈ΔNLt[:,j]∈ΔNL{t}[:, j] \in \Delta N 。

在定义LtLtL_{t} 之前,论文定义了一个优先权重(precedence weighting) pt∈ΔNpt∈ΔNp_{t} \in \Delta N,pt[i]pt[i]p_{t}[i] 表示第i个内存单元是最后一次写入的权重(degree),定义如下:

p0=0p0=0p_{0} = 0
pt=(1−∑iwwt[i])pt−1+wwtpt=(1−∑iwtw[i])pt−1+wtwp_{t} = (1 - \sum_{i} w_{t}^{w}[i])p_{t-1} + w_{t}^{w}

然后, LtLtL_{t} 定义如下:

L0[i,j]=0;∀i,jL0[i,j]=0;∀i,jL_{0}[i, j] = 0; \forall i,j
Lt=0;∀iLt=0;∀iL_{t} = 0; \forall i
Lt=(1−wwt[i]−wwt[j])Lt−1[i,j]+wwt[i]pt−1[j]Lt=(1−wtw[i]−wtw[j])Lt−1[i,j]+wtw[i]pt−1[j]L_{t} = (1 - w_{t}^{w}[i] - w_{t}^{w}[j])L_{t-1}[i,j] + w_{t}^{w}[i]p_{t-1}[j]

The rows and columns
of LtLtL_{t} represent the weights of the temporal links going into and out from particular
memory slots, respectively.

给定LtLtL_{t},the backward weighting bit∈ΔNbti∈ΔNb_{t}^{i} \in \Delta N and forward weighting fit∈ΔNfti∈ΔNf_{t}^{i} \in \Delta N for each read head i are defined as:

bit=LTtwr,it−1bti=LtTwt−1r,ib_{t}^{i} = L_{t}^{T}w_{t-1}^{r,i}
fit=Ltwr,it−1fti=Ltwt−1r,if_{t}^{i} = L_{t}w_{t-1}^{r,i}

其中,wr,it−1wt−1r,iw_{t-1}^{r,i}表示第i个read head在t-1时刻的read weighting 。

Read weighting

综上所述, 论文定义第i个read head 在t时刻的 read weighting wr,it∈ΔNwtr,i∈ΔNw_{t}^{r, i} \in \Delta N 如下:

wr,it=πit[1]bit+πit[2]cr,it+πit[3]fitwtr,i=πti[1]bti+πti[2]ctr,i+πti[3]ftiw_{t}^{r, i} = \pi_{t}^{i}[1]b_{t}^{i} + \pi_{t}^{i}[2]c_{t}^{r,i} + \pi_{t}^{i}[3]f_{t}^{i}

其中,πit∈S3πti∈S3\pi_{t}^{i} \in S_{3} 是read mode控制信号,cr,it∈SNctr,i∈SNc_{t}^{r,i} \in S_{N} 是Content-based addressing机制中得出的权重。content-based addressing 机制与Temporal memory linkage 机制的组合共同确定了第i个read head 在t时刻的read weighting wr,itwtr,iw_{t}^{r,i} 。

time ------------------------------------------>+-------------------------------+mask:         |0000000001111111111111111111111|+-------------------------------++-------------------------------+target:       |                              1| 'end-marker' channel.|         101100110110011011001 ||         010101001010100101010 |+-------------------------------++-------------------------------+observation:  | 1011001                       || 0101010                       ||1                              | 'start-marker' channel|        3                      | 'num-repeats' channel.+-------------------------------+

可微神经计算机(Differentiable neural computer)的介绍相关推荐

  1. 【读点论文】FBNetV2:Differentiable Neural Architecture Search for Spatial and Channel D扩大搜索空间,复用featuremap

    FBNetV2: Differentiable Neural Architecture Search for Spatial and Channel Dimensions Abstract 可微分神经 ...

  2. 【读点论文】FBNet:Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search可微分

    FBNet: Hardware-Aware Efficient ConvNet Design via Differentiable Neural Architecture Search Abstrac ...

  3. 开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍

    开发指南专题十四:JEECG微云快速开发平台MiniDao 介绍 13.MiniDao 介绍 13.1.  MiniDao简介及特征 MiniDao是Jeecg自己的持久化解决方案,具备了Hibern ...

  4. 微服务08_RabbitMQ的SpringAMQP基本介绍

    微服务08_RabbitMQ的SpringAMQP基本介绍 一.SpringAMQP 的基本介绍: AMQP Spring AMQP 二.SpringAMQP实现基础消息队列功能(rabbit中必须现 ...

  5. 1:微服务和Spring Cloud Alibaba介绍

    Spring Cloud Alibaba系列目录 提示:这里是第一章:微服务和Spring Cloud Alibaba介绍 微服务和Spring Cloud Alibaba介绍 Alibaba微服务组 ...

  6. 一、微服务和Spring Cloud Alibaba介绍

    微服务和Spring Cloud Alibaba介绍 1.微服务介绍 1.1 系统架构演变 随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化. 从互联网早起到现在,系 ...

  7. PMCAFF微分享 | 供应链金融套利套汇介绍

    分享主题:供应链金融&套利套汇介绍 分享时间:7月4日(周六)21:30 分享地点:PMcaff互联网金融群|第七期 分享嘉宾:Julie Yao&Johnson 文字整理:May-天 ...

  8. 微服务神经元(Neural)

    微服务架构中的神经组织,主要为分布式架构提供了集群容错的三大利刃:限流.降级和熔断.并同时提供了SPI.过滤器.JWT.重试机制.插件机制.此外还提供了很多小的黑科技(如:IP黑白名单.UUID加强版 ...

  9. HCS12X微控制器的外部总线接口介绍

    翻译的资料是公开的,在这里下载https://www.nxp.com/products/microcontrollers-and-processors/additional-processors-an ...

最新文章

  1. 计算机网络应用基础 王建珍,计算机网络应用基础
  2. 机器人的兴起:洞察2020全球机器人市场【Part 1】
  3. 38首经典华语情歌E文版
  4. 浏览器对于前端的作用
  5. 如何在O(1)的时间里删除单链表的结点
  6. chrome使用技巧
  7. Android PreferenceActivity 使用
  8. 文本框输入怎么样让键盘消失
  9. 关于flex布局学习分享
  10. 机器学习常见面试题整理
  11. proteus数码管不亮是什么原因_数码管灌封胶有何产品性能特点?如何正确使用?...
  12. 蓝桥杯 ALGO-114 算法训练 黑白无常
  13. linux 解压缩指令
  14. 【jQueryWEUI】自定义对话框-带有textarea
  15. Win11里面【应用或关闭Windows功能】在哪
  16. 计算机基础知识赏花主观题,春光无限好,正是花开时 快收好这份赏花指南!...
  17. 单片机(中断系统-串口通信)
  18. mybatisPlus插入语句
  19. HTML的标签与选择器
  20. 用这几个扫一扫识别文字的软件,告别办公烦恼

热门文章

  1. 全国计算机等级考试三级网络技术
  2. VUE是基于什么语言
  3. 武林c语言,听风一剑
  4. Macbook 466 光驱改造为ssd固态硬盘总结
  5. 【数据链路层】广播信道 碰撞检测CSMA 争用期
  6. Xshell 使用技巧
  7. After Effects for Graphic Design After Effects for Graphic Design Lynda课程中文字幕
  8. 失眠,开灯,看书,看数学书!
  9. SSID, BSSID, ESSID
  10. 数据分析有什么证书吗?多数小伙伴都认可CPDA