Unmodified/Modifed/Stage일 경우: 이 파일이 Git에 의해 관리가 되고 있다.
Untracked일 경우: 이 파일은 Git에 의해 관리가 안되고 있다. (= 방금 추가한 파일이거나 쓸모없는 파일임을 추측 가능)
Modified일 경우: 이 파일은 변경되었다. 변경되었다고 기록을 해야 한다.
Unmodified일 경우: 이 파일은 저번에 저장한 파일과 비교해보니 그대로이다.Git이 관리해주는 파일(Tracked File)은 다시 한번 더 파일의 상태를 3개의 상태로 세분화해서 관리합니다.
Unmodified: 파일이 수정되지 않은 상태 (= 파일이 최근에 저장한 상태 그대로임)
Modified: 파일이 수정된 상태 (= 파일이 최근에 저장한 파일과 달라짐)
Staged: 파일을 저장할 예정인 상태 (= 이 파일을 저장할 것이라는 뜻)
이러한 세분화된 상태들을 보고 우리들은 다음과 같은 정보를 알 수 있습니다.
Untracked File이란?
Untracked File은 이 파일이 Git 저장소에는 있지만 Git에 의해서 관리되고 있지 않은 파일입니다. Unmodified/Modifed/Stage이 세 가지 외의 상태는 모두 Untracked입니다. Untracked File은 삭제되든 변형이 일어나든 Git이 추적하고 있지 않기 때문에 손상되었을 때 Git으로 복구할 수 없습니다.
Git이 파일을 분류하는 방법에 대해서 알아봤습니다. 우리가 Git으로 관리되는 폴더에 넣어준 모든 파일은 이렇게 관리가 됩니다. 이제 이러한 Git이 분류해주는 파일의 상태를 확인하는 명령어를 배워봅시다.
add를 통해서 untracked 상태에서 벗어날 수 있다.
git commit -a -m “commit_name”
-a 는 auto adding이다. 하나하나 파일들을 add 하기 귀찮을 때 사용
이렇게 할 때 untracked된 파일은 commit 되지 않는다.
한번이라도 add를 한 tracked 된 파일에 대해서만 auto adding이 된다.
= git commit -am “commit_name”
add의 의미
commit 대기 상태를 만든다.
untracked를 tracked로 만든다
.gitignore
password나 오픈하면 안되는 정보들을 이 파일에 목록들을 저장해둔다.
여기에 들어가있는 곳은 기록된 파일들은 없는셈친다.
checkout은 head를 옮기고, reset은 head가 가리키는 branch를 옮긴다.
git reset —hard이전에 했던 commit으로 checkout하는 것과의 차이점은?취소를 한다고 하더라도 git은 삭제하지 않기 때문에 git reflog를 사용해서 삭제된 과거의 commit의 id로 갈 수 도 있다.
git은 working directory를 고려하지 않는다. commit을 하기 전에 stage에 올라간 것만 확인하고 commit한다.
master는 마지막 작업을 가르킨다.
head는 현재 작업을 가르킨다.
(head→master 가 아닐 경우)새 버전의 부모는 Head다.
detached head state라고 한다.
(head→master 일 경우) master 와 head는 새로운 버전을 가르킨다.
마지막 커밋으로 직접 head를 움직여줬다면 마스터는 헤드를 따라오지 않기 때문에 오류가 생길 수 있기 때문이다. 따라서 마지막 거로 갈거면 git checkout master를 써서 마스터로 head를 마스터를 가르키도록 만들어 줘라
깃은 어떠한 버전도 지우지 않고 수정하지 않는다. = 불변성 = 안정성
이전 작업으로 가고 싶다면
git chechkout “이전 작업의 주소”
실험이 끝났다면 master가 exp branch를 병합한다.
마스터에서 exp를 병합하기 위해서는 우선 head → master인 상태가 되어야 한다.
그 후 Merge 합니다.
Merge한 버전의 parent는 master1, exp1 이다. 즉, master와 병합한 branch이다.
master에 merge한 결과를 과거로 돌리고 싶다면 reset을 하면 된다.
exp가 master를 병합한다. => master를 업데이트 한다. 실험이 끝났다면, master가 exp(branch)를 병합한다. -> 'merge' into current branch 새로운 version의 부모는 master, exp(branch)이며 master는 새로 만들어진 version을 가리킨다. 병합을 취소하려면 'reset' current branch
position 마다, 즉 개별 단어마다 적용되기 때문에position-wise입니다. network는 두 번의 linear transformation과 activation function ReLU로 이루어져 있습니다.
residual connection
resnet 에서 제안된 residual block의 개념에서 유래했다.
x + F(x) 의 형태로 비선형 함수의 결과에 기존 인풋을 더해주는 방법이다.
처음에는 gredient vanising을 해결하기 위해서 사용되었다. layer의 중간 중간 short cut을 만들어서 depth가 늘어나도 gradient가 잘 통과하면서 문제를 해결하겠다.
이는 위의 문제도 해결했지만 skip connection을 하는 과정에서 앙상블(ensemble) 모델을 하는 효과도 가지고 있다.
layer normalization
LN(Layer Normalization)은 inputdml feature들에 대한 평균과 분산을 구해서 batch에 있는 각 input을 정규화한다.
BN(Batch Normalization)은 각 feature 들의 평균과 분산을 구해서 각 feature 를 정규화 한다.
scaled dot-product attention
pytorch
class ScaledDotProductAttention(nn.Module):
def forward(self,Q,K,V,mask=None):
d_K = K.size()[-1] # key dimension
scores = Q.matmul(K.transpose(-2,-1)) # FILL IN HERE
if mask is not None:
scores = scores.masked_fill(mask==0, -1e9)
attention = F.softmax(scores,dim=-1)
out = attention.matmul(V)
return out,attention
Q1) RNN이 가지고 있는 문제는 무엇이며 Transformer는 문제들을 어떻게 해소하였는가?
A1) Long term dependency 문제와 parallization 문제이다.
transformer는 recurrence를 사용하지 않고 대신 attention mechanism만을 사용해 input과 output의 dependency를 알아내기 때문에 long term depenency 문제를 해결하였다.
transformer에서는 학습 시 encoder와 decoder에서 각각 parallization 이 가능한 Multi-head attention을 사용하고 이는 각 시점의 정보를 충분히 반영할 수 있다는 장점을 가지고 있다.
attention은 입력 문장 전체는 행렬로 표현할 수 있고, Key,Value,Query도 모두 행렬로 저장되어 있으니까 모든 단어에 대한 attention 계산은 행렬곱으로 한번에 이루어질 수 있다.
반면에 RNN 같은 경우 순차적으로 계산해야 하기 때문에 병렬화가 불가능하다.
사실상 self-attention을 사용하기 때문에 위의 문제들을 해결 할 수있다.
Q2) RNN이 recurrent하기 때문에 병렬처리가 불가능 했지만 단어들 사이에 관계를 함의 할 수있었습니다. 그러면 transformer는 어떻게 RNN의 기능을 수행합니까?
A2) Self-Attention 과 positional encoding을 사용해서 해결한다.
Self attention은 매번 입력 문장에서 각 단어가 그 문장의 다른 어떤 단어와 연관성이 어떠한지 계산하는 과정이기 때문에 단어사이의 관계성에 집중해서 학습을 진행한다..
transformer모델은 순차적으로 계산이 이루어지는 CNN이나 RNN을 사용하지 않기 때문에 순서 정보를 따로 넣어준다. 이를 Positional encoding이라고 한다. Positional Encoding 방식은 여러가지가 있지만 논문에서는 사인/코사인 함수를 사용하였다. 이를 통해서 단어들 사이의 거리가 멀 경우에는 PE 값도 커진다.
즉, Self-Attention이 주된 기능이고 Positional encoding이 부가적인 역할을 한다.
Q4) decoder에서 masked multi-head attention을 하는 이유는 무엇인가?
A4) 모델의 목표는 sequential 데이터를 정확히 예측하고자 하기 때문에 전체 정보를 미리 알려주는 것이 아니라 순차적으로 데이터를 제공하며 유추하기를 원하기 때문에 Mask를 사용하여 순서가 되지 않은 데이터의 정보(Attention)를 숨기는 과정을 거친다. 이렇게 Mask를 사용하는 이유는 Input Data가 벡터로 전체 데이터가 한번에 들어가기 때문이다.
encoder- decoder 구조의 모델들은 순차적으로 input을 받기 때문에 i+1 번째 정보를 고려하지 않지만 transformer는 한번에 값을 받기 때문에 mask를 한다.