방명록
- NLP (3)2024년 03월 10일 10시 48분 42초에 업로드 된 글입니다.작성자: 재형이반응형
- 오늘은 UFC 션 오말리의 챔피언 타이틀 방어전이 하는 날입니다
- 지금 아침부터 작성 중인데 아마 글을 올릴 때 쯤이면 이미 결과가 나왔을 수도 있겠네요
- 션 오말리 화이팅~!!
- 션 오말리 승~
1. 의미 연결망 분석(Semantic Network Analysis)
- 단어 간의 관계를 분석하기 위해 사용
- 단어의 관계에 적용하여 텍스트의 의미 구조를 파악하려는 분석 기법이다
- 특정 단어가 어떤 단어와 함께 자주 사용되었는가?
- 문서의 저자가 강조하고자 하는 것이 무엇인지, 어떤 어조를 띄고 있는지 추측할 수 있음
- SNA 분석 방법
- 문서를 구성하고 있는 단어를 노드로 구성하고 노드와 노드를 연결
- 네트워크 = 문서를 구성하고 있는 단어와 관계
- SNA 분석는 배달 어플의 리뷰를 분석해서 글쓴이의 감정을 파악하는데 사용할 수 있다
- 예시) 피자 배달 리뷰 SNA 분석
- 원문
- 피자는 치즈!, 토핑 종류가 많아요, 치즈도 많네요
- 텍스트 정제
- 피자, 치즈, 토핑, 종류, 많다
- 인접 행렬 (Adjacent Matrix)
피자 치즈 많다 토핑 종류 피자 0 1 0 0 0 치즈 1 0 1 0 0 많다 0 1 0 1 1 토핑 0 0 1 0 1 종류 0 0 1 1 0 - 연결망 그래프
- SNA 속성
- 연결 정도
- 하나의 노드에서 뻗어나가는 엣지의 갯수
- 하나의 노드에서 뻗어나가는 엣지의 갯수
- 연결 중심성 (Degree centrality)
- 친구 수 (degree)가 많은 사람이 더 중심적 역할(한 단어에 직접 연결된 다른 단어의 수가 얼마나 많은지 측정)
- 연결망의 크기에 따라 값을 비교하기 어렵기 때문에, 표준화 필요
- $\frac{특정 노드 i와 직접 연결된 노드 수}{노드 i와 직간접적으로 연결된 모든 노드 수}$
- 매개 중심성 (Betweenness centrality)
- 다리(bridge) 역할을 많이 하는 사람이 더 중심적 역할
- 한 단어가 다른 단어들과의 연결망을 구축하는 데 매개자 역할을 얼마나 수행하는지 측정
- 단어들의 등장 빈도가 낮더라도 매개 중심성이 높으면 단어들 간 의미 부여 역할이 커짐
- 근접 중심성 (Closeness centrality)
- 다른 노드와 더 가깝게 연결된 노드가 더 중심적 역할
- 한 단어가 다른 단어에 얼마나 가깝게 있는지 측정
- 직접 연결 뿐 아니라 간접적으로 연결된 모든 단어들 사이의 거리를 측정
- 연결 정도
- 원문
2. SNA를 위한 파이썬 패키지
- nodes() : 노드 정보 확인
- edges() : 엣지 정보 확인
- 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
- 자연어를 벡터로 변환한다 → Embedding Layer
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)해서 보기 때문입니다. 쉽게 생각하면 중요한 부분에 형광펜으로 칠한다고 생각하면 될 것 같습니다
- 어텐션을 함수로 표현하면 주로 다음과 같이 표현됩니다
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
- 입력 문장을 잘 표현하기 위해 사용
- 입력 문장을 잘 표현하기 위해 사용
- Masked Self attention
- Masked Self attention는 Attention과 달리 Transformer는 한번에 입력값들을 전부 보기 때문에 아직 봐야할 부분이 아닌 곳을 Masking 처리를 해줘야 함 (미래의 데이터는 숨기기)
- Masked Self attention는 Attention과 달리 Transformer는 한번에 입력값들을 전부 보기 때문에 아직 봐야할 부분이 아닌 곳을 Masking 처리를 해줘야 함 (미래의 데이터는 숨기기)
- Scaled dot-product attention
- Position wise feed forward networks
- 문장의 각 위치를 서로 독립적으로 학습
- Embeddings and Softmax
- Positional Encoding
- RNN을 제거하였지만 단어의 위치 정보를 전달 할 수 있는 방법이 필요
- 입력 단어의 임베딩 벡터에 위치 정보를 더하여 사용
– d = 512, (n = 10000)
- Encoder and Decoder stacks
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을 진행하는 모델
- BERT를 시작으로 계속해서 다양해짐
반응형'인공지능 > 인공지능 기초' 카테고리의 다른 글
GAN(2), AI 관련 지식(1) (0) 2024.03.12 Auto Encoder, GAN(1) (0) 2024.03.11 NLP (2) (0) 2024.03.09 Embedding (2), NLP (1) (2) 2024.03.08 신경망 성능 향상, 1D conv, Embedding (1) (2) 2024.03.07 다음글이 없습니다.이전글이 없습니다.댓글