출력 : 처리 된 텐서는 인코더 층의 출력으로 반환됩니다.
요약 : encoderlayer 클래스는 변압기 인코더의 단일 레이어를 정의합니다. 그것은 잔류 연결, 층 정규화 및 적절하게 적용되는 다중 헤드 자체 변환 메커니즘에이어서 위치 현지 공급 신경 네트워크를 캡슐화합니다. 이러한 구성 요소를 사용하면 인코더가 입력 데이터의 복잡한 관계를 캡처하고 다운 스트림 작업에 유용한 표현으로 변환 할 수 있습니다. 일반적으로, 이러한 인코더 층은 트랜스포머 모델의 완전한 인코더 부분을 형성하기 위해 쌓입니다.
4. 디코더 블록 구축
클래스 정의 :
pip3 install torch torchvision torchaudio
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
초기화 :
매개 변수 :
d_model : 입력의 치수
num_heads : 멀티 헤드주의에주의를 기울이는 수의 수
<:> d_ff : 피드 포워드 네트워크에서 내부 층의 치수.
드롭 아웃 : 정규화를위한 드롭 아웃 속도
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
구성 요소 :
<_> self.self_attn : 대상 시퀀스에 대한 다중 헤드 자체 정보 메커니즘
self.cross_attn : 인코더의 출력에 참석하는 다중 헤드주의 메커니즘.
self.feed_forward : 위치에 대한 피드 포워드 신경 네트워크.
self.norm1, self.norm2, self.norm3 : 레이어 정규화 구성 요소
self.dropout : 정규화를위한 드롭 아웃 레이어
전방
import torch
import torch.nn as nn
import torch.optim as optim
import torch.utils.data as data
import math
import copy
로그인 후 복사
로그인 후 복사
메소드 :
입력 입력
:
x : 디코더 층에 대한 입력.
ENC_OUTPUT : 해당 인코더의 출력 (교차 변호 단계에서 사용).
<_ _> src_mask : 인코더 출력의 특정 부분을 무시하는 소스 마스크.
<_ _> tgt_mask : 디코더 입력의 특정 부분을 무시하기위한 대상 마스크.
-
처리 단계 :
대상 시퀀스에 대한 자체 변환 : 입력 X는 자체 변환 메커니즘을 통해 처리됩니다.
add and normalize (자체 소송 후) : 자체 소송의 출력은 원래 x에 추가 된 다음 Norm1을 사용하여 드롭 아웃 및 정규화됩니다.
인코더 출력과의 교차 중단 : 이전 단계의 정규화 된 출력은 인코더의 출력 ENC_OUTPUT에 참석하는 크로스 오프닝 메커니즘을 통해 처리됩니다.
추가 및 정규화 (교차 변호 후) : 크로스 텐션의 출력 이이 단계의 입력에 추가 된 다음 Norm2를 사용하여 드롭 아웃 및 정규화됩니다.
피드 포워드 네트워크 : 이전 단계의 출력은 피드 포워드 네트워크를 통해 전달됩니다.
추가 및 정규화 (피드 포워드 후) : 피드 포워드 출력 이이 단계의 입력에 추가 된 다음 Norm3을 사용하여 드롭 아웃 및 정규화됩니다.
출력 : 처리 된 텐서는 디코더 층의 출력으로 반환됩니다.
-
요약 :
디코더 레이어 클래스는 변압기 디코더의 단일 층을 정의합니다. 다중 헤드 자체 변환 메커니즘, 멀티 헤드 교차 변형 메커니즘 (인코더 출력에 참석), 위치 현장의 피드 포워드 신경망 및 해당 잔류 연결, 레이어 정규화 및 드롭 아웃 레이어로 구성됩니다. 이 조합을 사용하면 디코더가 목표 시퀀스 및 소스 시퀀스를 모두 고려하여 인코더의 표현에 따라 의미있는 출력을 생성 할 수 있습니다. 인코더와 마찬가지로, 다중 디코더 층은 일반적으로 변압기 모델의 완전한 디코더 부분을 형성하기 위해 쌓입니다.
다음으로, 포괄적 인 변압기 모델을 구성하기 위해 인코더와 디코더 블록이 모여 들었습니다. -
5. 인코더와 디코더 레이어를 결합하여 완전한 변압기 네트워크를 만듭니다 -
-
그림 4. 변압기 네트워크 (출처 : 원본 용지의 이미지)
클래스 정의 : -
초기화 : -
생성자는 다음 매개 변수를 취합니다
-
<_ _> src_vocab_size : 소스 어휘 크기.
<_ _> tgt_vocab_size : 대상 어휘 크기.
d_model : 모델 임베딩의 치수
num_heads : 멀티 헤드주의 메커니즘의주의 헤드 수.
num_layers : 인코더와 디코더 모두에 대한 레이어 수.
<:> d_ff : 피드 포워드 네트워크에서 내부 층의 차원.
max_seq_length : 위치 인코딩의 최대 시퀀스 길이
드롭 아웃 : 정규화를위한 드롭 아웃 속도.
그리고 다음 구성 요소를 정의합니다
self.encoder_embedding : 소스 시퀀스에 대한 임베딩 레이어
self.decoder_embedding : 대상 시퀀스에 대한 임베딩 레이어
self.positional_encoding : 위치 인코딩 구성 요소
self.encoder_layers : 인코더 레이어 목록
self.decoder_layers : 디코더 층 목록
self.fc : 대상 어휘 크기를 위해 최종 완전히 연결된 (선형) 레이어 매핑.
self.dropout : 드롭 아웃 레이어.
-
마스크 메소드 생성 메소드 : -
이 방법은 소스 및 대상 시퀀스에 대한 마스크를 만드는 데 사용되어 패딩 토큰이 무시되고 대상 시퀀스에 대한 훈련 중에 미래 토큰이 보이지 않도록합니다. - .
전방 방법 :
-
이 방법은 변압기의 순방향 패스를 정의하고 소스 및 대상 시퀀스를 취하고 출력 예측을 생성합니다.
입력 임베딩 및 위치 인코딩 : 소스 및 대상 시퀀스는 먼저 각각의 임베딩 층을 사용하여 내장 된 다음 위치 인코딩에 추가됩니다.
인코더 레이어 : 소스 시퀀스는 엔코더 레이어를 통해 전달되며 최종 인코더 출력은 처리 된 소스 시퀀스를 나타냅니다.
디코더 레이어 : 대상 시퀀스와 인코더의 출력은 디코더 층을 통과하여 디코더의 출력을 초래합니다.
최종 선형 레이어 : 디코더의 출력은 완전히 연결된 (선형) 레이어를 사용하여 대상 어휘 크기에 매핑됩니다.
-
출력 :
최종 출력은 대상 시퀀스에 대한 모델의 예측을 나타내는 텐서입니다.
요약 : -
변압기 클래스는 임베딩, 위치 인코딩, 인코더 층 및 디코더 층을 포함하여 변압기 모델의 다양한 구성 요소를 모았습니다. 교육 및 추론을위한 편리한 인터페이스를 제공하여 다중 헤드주의, 피드 포워드 네트워크 및 계층 정규화의 복잡성을 캡슐화합니다.
이 구현은 표준 변압기 아키텍처를 따라 기계 번역, 텍스트 요약 등과 같은 시퀀스-시퀀스 작업에 적합합니다. 마스킹을 포함 시키면 모델이 시퀀스 내에서 인과 적 의존성을 고착하여 패딩 토큰을 무시하고 Future Tokens의 정보 누출을 방지 할 수 있습니다.
이러한 순차적 단계는 변압기 모델이 입력 시퀀스를 효율적으로 처리하고 해당 출력 시퀀스를 생성 할 수 있도록 강화합니다.
Pytorch 변압기 모델 훈련
샘플 데이터 준비
예시적인 목적을 위해이 예에서는 더미 데이터 세트가 제작됩니다. 그러나 실제 시나리오에서는보다 실질적인 데이터 세트가 사용될 것이며 프로세스에는 소스 및 대상 언어 모두에 대한 어휘 매핑 생성과 함께 텍스트 전처리가 포함됩니다.
pip3 install torch torchvision torchaudio
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
하이퍼 파라미터 :
이 값은 변압기 모델의 아키텍처와 동작을 정의합니다.
<_> src_vocab_size, tgt_vocab_size : 소스 및 대상 시퀀스의 어휘 크기는 5000으로 설정되어 있습니다.
d_model : 모델 임베딩의 차원, 512로 설정되었습니다
num_heads : 멀티 헤드주의 메커니즘의주의 헤드 수, 8으로 설정
num_layers : 인코더와 디코더 모두에 대한 레이어 수는 6으로 설정되었습니다.
<:> d_ff : 피드 포워드 네트워크에서 내부 층의 차원, 2048로 설정
max_seq_length : 위치 인코딩의 최대 시퀀스 길이, 100으로 설정
드롭 아웃 : 정규화를위한 드롭 아웃 속도, 0.1
변압기 인스턴스 생성 :
이 라인은 변압기 클래스의 인스턴스를 생성하여 주어진 하이퍼 파라미터로 초기화합니다. 인스턴스는이 과수기계에 의해 정의 된 아키텍처와 동작을 갖습니다.
랜덤 샘플 데이터 생성 :
다음 선은 랜덤 소스 및 대상 시퀀스를 생성합니다
-
SRC_DATA : 1과 src_vocab_size 사이의 랜덤 정수는 모양 (64, max_seq_length)을 가진 소스 시퀀스의 배치를 나타냅니다.
<__> tgt_data : 1과 tgt_vocab_size 사이의 랜덤 정수는 모양 (64, max_seq_length)을 가진 대상 시퀀스의 배치를 나타냅니다.
이러한 랜덤 시퀀스는 변압기 모델에 대한 입력으로 사용될 수 있으며, 길이 100의 64 개의 예와 시퀀스로 데이터 배치를 시뮬레이션 할 수 있습니다.
요약 : -
코드 스 니펫은 변압기 모델을 초기화하고 모델에 공급 될 수있는 랜덤 소스 및 대상 시퀀스를 생성하는 방법을 보여줍니다. 선택된 하이퍼 파라미터는 변압기의 특정 구조 및 특성을 결정합니다. 이 설정은 기계 번역 또는 텍스트 요약과 같은 실제 시퀀스-시퀀스 작업에서 모델을 교육하고 평가하는 더 큰 스크립트의 일부일 수 있습니다.
모델 훈련
다음으로,이 모델은 위에서 언급 한 샘플 데이터를 사용하여 교육을받습니다. 그러나 실제 시나리오에서는 훨씬 더 큰 데이터 세트가 사용될 것이며, 이는 일반적으로 훈련 및 검증 목적으로 별개의 세트로 분할됩니다.
.
-
손실 함수 및 옵티마이저 : -
criterion = nn.crossentropyloss (ingore_index = 0) : 손실 함수를 교차 엔트로피 손실로 정의합니다. INGORE_INDEX 인수는 0으로 설정되어 있습니다. 즉, 손실은 인덱스가 0 인 대상을 고려하지 않습니다 (일반적으로 패딩 토큰 용으로 예약).
Optimizer = Optim.Adam (...) : 학습 속도가 0.0001이고 특정 베타 값을 가진 Adam으로 Optimizer를 Adam으로 정의합니다.
-
모델 훈련 모드 : -
transformer.train () : 트랜스포머 모델을 교육 모드로 설정하여 훈련 중에 만 적용되는 드롭 아웃과 같은 동작을 가능하게합니다.
-
훈련 루프 :
코드 스 니펫은 일반적인 훈련 루프를 사용하여 100 개의 에포크 모델을 훈련시킵니다.
범위 (100)의 epoch의 경우 : 100 개가 넘는 훈련 에포크를 반복합니다
optimizer.zero_grad () : 이전 반복에서 그라디언트를 지 웁니다
output = transformer (src_data, tgt_data [:, : -1]) : 변압기를 통해 소스 데이터와 대상 데이터 (각 시퀀스의 마지막 토큰 제외)를 전달합니다. 이것은 대상이 하나의 토큰으로 이동하는 순서 대 순 시퀀스 작업에서 일반적입니다.
loss = criterion (...) : 모델의 예측과 대상 데이터 사이의 손실을 계산합니다 (각 순서에서 첫 번째 토큰 제외). 손실은 데이터를 1 차원 텐서로 재구성하고 교차 엔트로피 손실 함수를 사용하여 계산됩니다.
loss.backward () : 모델의 매개 변수와 관련하여 손실의 그라디언트를 계산합니다.
optimizer.step () : 계산 된 그라디언트를 사용하여 모델의 매개 변수를 업데이트합니다
print (f "epoch : {epoch 1}, 손실 : {loss.item ()}") : 현재 에포크 번호와 그 시대의 손실 값을 인쇄합니다.
요약 :
이 코드 스 니펫은 100 개의 에포크에 대한 무작위로 생성 된 소스 및 대상 시퀀스에서 변압기 모델을 훈련시킵니다. Adam Optimizer 및 Cross-Entropy Loss 함수를 사용합니다. 손실은 각 시대에 대해 인쇄되어 훈련 진행 상황을 모니터링 할 수 있습니다. 실제 시나리오에서는 임의의 소스 및 대상 시퀀스를 기계 번역과 같은 작업의 실제 데이터로 바꾸게됩니다.
변압기 모델 성능 평가
모델을 훈련 한 후 성능은 유효성 검사 데이터 세트 또는 테스트 데이터 세트에서 평가할 수 있습니다. 다음은 이것이 어떻게 수행 될 수 있는지에 대한 예입니다.
평가 모드 :
transformer.eval () : 변압기 모델을 평가 모드에 넣습니다. 이것은 훈련 중에 만 사용되는 드롭 아웃과 같은 특정 동작을 끄기 때문에 중요합니다.
- 랜덤 유효성 검사 데이터를 생성합니다 :
-
val_src_data : 1과 src_vocab_size 사이의 랜덤 정수, 모양 (64, max_seq_length)의 유효성 검사 소스 시퀀스를 나타냅니다.
val_tgt_data : 1과 tgt_vocab_size 사이의 랜덤 정수, 모양 (64, max_seq_length)을 가진 유효성 검사 대상 시퀀스의 배치를 나타냅니다.
검증 루프 :
Torch.no_grad () with <...> : 유효성 검사 중에 그라디언트를 계산할 필요가 없으므로 그라디언트 계산을 비활성화합니다. 이렇게하면 메모리 소비를 줄이고 계산 속도를 높일 수 있습니다
val_output = 변압기 (Val_Src_data, val_tgt_data [:, : -1]) : 변압기를 통해 유효성 검사 소스 데이터와 유효성 검사 대상 데이터 (각 시퀀스의 마지막 토큰 제외)를 전달합니다.
val_loss = criterion (...) : 모델의 예측과 검증 대상 데이터 (각 시퀀스에서 첫 번째 토큰 제외) 사이의 손실을 계산합니다. 손실은 데이터를 1 차원 텐서로 재구성하고 이전에 정의 된 교차 엔트로피 손실 함수를 사용하여 계산됩니다.
print (f "유효성 검사 손실 : {val_loss.item ()}") : 유효성 검사 손실 값을 인쇄합니다
-
요약 :
이 코드 스 니펫은 무작위로 생성 된 유효성 검사 데이터 세트의 변압기 모델을 평가하고 검증 손실을 계산하며 인쇄합니다. 실제 시나리오에서는 임의의 검증 데이터를 작업중인 작업의 실제 유효성 검사 데이터로 대체해야합니다. 유효성 검사 손실은 보이지 않는 데이터에서 모델이 얼마나 잘 수행되는지에 대한 표시를 제공 할 수 있습니다. 이는 모델의 일반화 능력의 중요한 척도입니다.
변압기 및 포옹 얼굴에 대한 자세한 내용은 변압기 및 포옹 얼굴 사용에 대한 소개 인 튜토리얼이 유용합니다.
결론 및 추가 자원
결론적으로,이 튜토리얼은 딥 러닝을위한 가장 다양한 도구 중 하나 인 Pytorch를 사용하여 변압기 모델을 구성하는 방법을 보여주었습니다. 병렬화 능력과 데이터에서 장기 종속성을 포착하는 능력으로 변압기는 다양한 필드, 특히 번역, 요약 및 감정 분석과 같은 NLP 작업에서 엄청난 잠재력을 가지고 있습니다.
고급 딥 러닝 개념과 기술에 대한 이해를 심화시키기 위해 Datacamp의 Keras와의 고급 딥 러닝 과정을 탐색하는 것을 고려하십시오. 별도의 튜토리얼에서 Pytorch와 함께 간단한 신경망을 구축하는 것에 대해 읽을 수도 있습니다.
최고 AI 인증을 받으 - ai.get 인증을 효과적이고 책임감있게 사용할 수 있음을 보여줍니다.