number_of_nodes() : 노드의 수, number_of_edges() : 엣지의 수
nx.get_node_attributes(NetworkX, Key) : 노드의 속성 출력
nx.get_edge_attributes(NetworkX, 'weight') : 가중치 출력
neighbors(x) : 노드 x와 연결된 노드의 수
NetworkX [x] [y] : 노드 x와 노드 y 사이의 연결 강도 (weight) 구하기
pyplot 라이브러리를 이용한 그래프 시각화
SNA 속성 구하기
연결 중심성
매개 중심성
근접 중심성
3. 자연어 처리 분야에서 사용하는 신경망
자연어 처리 분야에서는 보통 다음과 같은 프로세스로 신경망이 이용된다
자연어를 벡터로 변환한다 → Embedding Layer
자연어의 특징을 추출한다 → Conv1D Layer
자연어의 시계열성을 학습한다 → RNN
3-1. RNN (Recurrent Neural Network)
유닛 사이의 연결이 방향성 있는 사이클(Directed Cycle)을 형성하며 자신을 가리키는 반복 가중치 구조(Recurrent Weight)를 포함하는 신경망 알고리즘
연속된 데이터 상에서 이전 순서의 hidden node의 값을 저장하고, 다음 순서의 입력 데이터로 학습할 때 사용
Sequential Data 학습
과거학습의 정보를 잃지 않고 연속적인 정보의 흐름을 학습에 반영 ($y_{k-1} → y_{k} → y_{k+1}$)
RNN의 방식에는 다양한 방식이 존재한다
Conv1D를 사용한 Text classifier code example
# A integer input for vocab indices.
inputs = keras.Input(shape=(None,), dtype="int64")
# Next, we add a layer to map those vocab indices into a space of dimensionality
# 'embedding_dim'.
x = layers.Embedding(max_features, embedding_dim)(inputs)
x = layers.Dropout(0.5)(x)
# Conv1D + global max pooling
x = layers.Conv1D(128, 7, padding="valid", activation="relu", strides=3)(x)
x = layers.Conv1D(128, 7, padding="valid", activation="relu", strides=3)(x)
x = layers.GlobalMaxPooling1D()(x)
# We add a vanilla hidden layer:
x = layers.Dense(128, activation="relu")(x)
x = layers.Dropout(0.5)(x)
# We project onto a single unit output layer, and squash it with a sigmoid:
predictions = layers.Dense(1, activation="sigmoid", name="predictions")(x)
model = keras.Model(inputs, predictions)
# Compile the model with binary crossentropy loss and an adam optimizer.
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
LSTM를 사용한 Text classifier code example
# Input for variable-length sequences of integers
inputs = keras.Input(shape=(None,), dtype="int32")
# Embed each integer in a 128-dimensional vector
x = layers.Embedding(max_features, 128)(inputs)
# Add 2 bidirectional LSTMs
x = layers.Bidirectional(layers.LSTM(64, return_sequences=True))(x)
x = layers.Bidirectional(layers.LSTM(64))(x)
# Add a classifier
outputs = layers.Dense(1, activation="sigmoid")(x)
model = keras.Model(inputs, outputs)
model.summary()
4. 시퀀스 투 시퀀스(Sequence-to-Sequence, seq2seq)
seq2seq는 번역기에서 대표적으로 사용되는 모델입니다
seq2seq는 크게 인코더와 디코더라는 두 개의 모듈로 구성됩니다
인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만드는데, 이를 컨텍스트 벡터(context vector)라고 합니다
입력 문장의 정보가 하나의 컨텍스트 벡터로 모두 압축되면 인코더는 컨텍스트 벡터를 디코더로 전송합니다. 디코더는 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력합니다
각각의 인코더와 디코더는 RNN 입니다
seq2seq의 단점
인코더의 출력물인 context vector는 고정된 길이의 벡터이기 때문에 입력 문장의 길이가 길어지면 필요한 정보들이 모두 벡터에 담기지 못하여 loss가 생김 → Bottleneck Problem 발생
Vanishing Gradient 문제를 해결하지 못함
그래서 seq2seq 논문이 발표된 바로 다음해 2015년에 Attention이라는 모델이 등장하게 됩니다
5. Attention
어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step)마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점입니다
이름이 Attention인 이유는 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 더 집중(attention)해서 보기 때문입니다. 쉽게 생각하면 중요한 부분에 형광펜으로 칠한다고 생각하면 될 것 같습니다
Paper: Neural Machine Translation by Jointly Learning to Align and Translate(Dzmitry Bahdanau et al., ICLR 2015)
어텐션을 함수로 표현하면 주로 다음과 같이 표현됩니다 Attention(Q, K, V) = Attention Value
Q = Query : t 시점의 디코더 셀에서의 은닉 상태
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들
어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(Key)'와의 유사도를 각각 구합니다. 그리고 구해낸 이 유사도를 키와 맵핑되어있는 각각의 '값(Value)'에 반영해줍니다. 그리고 유사도가 반영된 '값(Value)'을 모두 더해서 리턴합니다
Attention에는 다양한 종류가 있는데 여기서는 닷 프로덕트 어텐션(Dot-Product Attention)을 다룬다
Attention에서는 인코더의 히든 스테이트들을 가지고 현재 시점에서 디코더에서 구하려고 하는 값과의 연관성을 구해서 어떤 단어가 현재 번역하려는 단어와 가장 연관이 있는지를 찾는다. 이렇게 하면 디코더가 출력 단어를 더 정확하게 예측하는데 도움을 줄 수 있다
그렇게 하기 위해서 어텐션 값이라는 것을 구한 후에 현재 구하려고 하는 디코더의 히든 스테이트와 결합하여 출력물을 만들어야 한다.
어텐션 값은 어텐션 스코어라는 것을 구한 후에 소프트맥스를 통해 어텐션 분포를 구해서 각각 나온 분포값과 인코더의 히든 스테이트를 내적하여 구해야 한다
어텐션 스코어는 이전에 진행했던 시점에서의 인코더 히든 스테이트들 각각이 현재 구하려고 하는 디코더에 얼마나 연관이 있는지를 매긴 점수이다. 이것을 소프트맥스를 사용하면 확률로 나타낼 수 있다.
어텐션 스코어 구하는 공식
Attention 정리
seq2seq에서 context vector가 fix된 것을 보완
타겟 단어와 중요한 관계를 가지는 부분을 자동(동적)으로 찾음
6. Transformer (Attention is all you need!)
Transformer는 RNN을 Long-term dependency, Gradient Vanishing 근본적인 한계로 지적하고, RNN은 제외하고 Attention 구조만 사용 (Attention is all you need!)한 모델이다
Model Architecture
Encoder and Decoder stacks
Encoder와 Decoder를 각각 6개 사용
Encoder
두 파트로 구성(Multi-head self attention, Position wise fully connected feed forward network)
각 파트에 residual connection 사용
모든 파트의 Output dimension은 512
Decoder
6개의 독립적인 구조
세 파트로 구성 (Masked Multi-Head Attention, Multi-head self attention, Position wise fully connected feed forward network)
각 파트에 residual connection 사용
모든 파트의 Output dimension은 512
Attention
Scaled dot-product attention
Multi-head attention
Self attention
입력 문장을 잘 표현하기 위해 사용 Self attentionSelf attention
Masked Self attention
Masked Self attention는 Attention과 달리 Transformer는 한번에 입력값들을 전부 보기 때문에 아직 봐야할 부분이 아닌 곳을 Masking 처리를 해줘야 함 (미래의 데이터는 숨기기) Masked Self attention
Position wise feed forward networks
문장의 각 위치를 서로 독립적으로 학습
Embeddings and Softmax
Positional Encoding
RNN을 제거하였지만 단어의 위치 정보를 전달 할 수 있는 방법이 필요
입력 단어의 임베딩 벡터에 위치 정보를 더하여 사용 – d = 512, (n = 10000) Positional Encoding
7. BERT
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding, Jacob Devlin, Ming-Wei Chang , Kenton Lee, Kristina Toutanova
bi-directional Transformer로 이루어진 언어모델
잘 만들어진 BERT 언어모델 위에 1개의 classification layer만 부착하여 다양한 NLP task를 수행
영어권에서 11개의 NLP task에 대해 SOTA(state of the art) 달성
BERT는 대량의 코퍼스를 Pre-training한 다음, 각 Task에 따라서 fine-tuning을 진행하는 모델이다
7-1. PLM
Pre-training then fine-tuning
대량의 코퍼스를 Pre-training한 다음, 각 Task에 따라서 fine-tuning을 진행하는 모델