[reference 및 figure 출처]
https://nlpinkorean.github.io/illustrated-transformer/
https://arxiv.org/pdf/1706.03762.pdf
https://www.youtube.com/watch?v=mxGCEWOxfe8
들어가는 사족
transformer를 검색하면
자꾸 이 영화? 이미지가 떴는데 하도 많이 검색해서 그런가 이제는 검색해도
이런 것만 뜬다 ㅋㅋㅋ 구글 천재
얼른 faster rcnn 읽은 것도 리뷰 올려야 하는데 몰아치는 과제의 홍수 속에서 살아남을 수가 없다
이상하다 분명 방학인데 학기보다 더 바쁜 것 같다
그리고 왜 회사는 내가 퇴사하려고 하니까 일을 많이 주는가!!!! 아오!!!!!!
이번주도 파이팅....
엄... 이건 카테고리를 어디에 넣어야 할지 애매해서 그냥 NLP로 넣어버렸다! 기타 카테고리에서도 NLP를 하나 찾을 수 있는데 욘석은 왜 여기있냐? 하면 다음에 읽을 논문 때문이다. Transformer는 원래 NLP 분야에서 획기적인! 변화를 이끌어냈었는데, 이를 image 영역에도 변화의 바람을 불러일으켰기 때문이다. 그래서 Transformer 논문을 읽은 다음은, 또 구글에서 발표한 An Image is Worth 16*16 words: transfomer for image recognition as scale이다. 구글이랑 무슨 연이 있나!? 두근..
덧으로 이 논문을 이해하기 위해서 RNN과 Seq2seq, 그리고 attention 메커니즘을 다시 공부했다. 아무래도 NLP는 눈길도 안 줬던 터라... 교류학술제 때문에 어쩔 수 없이 보고 있지만.. 입력이나 임베딩 이런 단어들을 몰라서 혼란스러웠다. Attetion 공부한 것도 본 포스팅에 올리는 것까지 하고 싶지만 아무래도 바쁘다 바빠 현대사회다 보니 가능할지는 잘 모르겠다. 하지만 최대한.. 나처럼 NLP는 초면인 사람들이 이 글을 읽는다고 가정하고 글을 열씸히 써보겠다. 열심히가 아니다, 열씸히다.! 앗 근데 Seq2seq까지는 알아야 한다. 엇 그럼 초면이 아닌가... 만약 Attention 메커니즘을 이해하고 있다면 바로 핑크 하이라이트 된 "Attention is all you need" 부터 읽으면 된다.
Seq2seq는 이렇게 생긴 친구다
RNN을 이용해서 input 인 문장을 하나의 context vector로 압축을 한다. 즉 마지막 input sequence의(혹은 마지막 time step) hidden state라고 생각하면 될 것 같다. 이 context vector는 decoder에서 0 시점의 (0 time step) hidden state로 이용된다. 이후론 인코더와 마찬가지로 RNN을 진행한다. 언제까지? 다음 output이 <eos>로 예측될 때까지.
(*eos end of sentence)
(*sos start of sentence)
하지만 문제점이 있다.
(1) 긴 문장을 고정된 길이의 context vector로 '압축'을 하다보니, 정보 손실이 크다.
(2) 기울기 소실의 문제점을 극복하지 못한다.
따라서 이를 극복하고자 나온 것이 Attention 메커니즘이고, 도식화하면 아래와 같다. 그림 출처 링크를 따라가서 설명을 읽어봐도 좋다. 참고로 나는 유튜브에 이 영상이 제일 이해가 쉬웠다.
인코더와 디코더를 context vector로 연결하는 것이 아니라 attention mechanism을 이용한다. 어텐션을 한 문장으로 설명하자면 '다음에 올 단어는 input sequence 중에서 관련이 있어 보이는 애를 우선적으로 고려해서 예측해봐야겠다' 이다. 그럼 연관성이 높은 애들은 어떻게 찾느냐? attention score이 그 기준이 된다.
디코더에서 t 시점의 output을 예측할 때 사용하는 값은
(1) 현 시점의 input vector(t-1상태의 output vector)
(2) 전 시점의 hidden state($s_{t-1}$로 notation 하겠다)
(3) 그리고 attention score
이렇게 3가지 이다.
그렇다면 attention score는 어떻게 구하느냐?
(1) encoding의 모든 hidden state와 $s_{t-1}$를 곱한다.
(2) (1)에서 계산된 값에 softmax 함수를 거쳐서 확률값을 구한다 : 어탠션 스코어 (아래 그림에서 바그래프 처럼 생긴 것)
(3) 이렇게 나온 벡터와 각 시점의 hidden state를 곱한 값들을 더한다 : 어탠션 분포 (아래 그림에서 삼각형)
(4) 위에서 계산한 값과 현 시점의 hidden state($s_{t}$)를 concatenate한다. (아래 그림에서 다이아몬드)
(5) 이 concatenate한 벡터를 가중치 행렬과 곱해준다. (아래 그림에서 dense)
(6) tanh에 (5)의 값을 넣어준다.
(7) 뾰로롱~ 출력값
(위 설명에서는 쿼리, 키, 벨류 값이 빠져있다. 그래서 간략한 설명이다.)
엄청 간략하게 설명을 해봤다. 자세히 알고 싶다면 스스로 노력하도록! 나는 나를 너무 강하게 키워...
Attention is all you need
초록Abstract
대부분의 sequence transduction model들은 인코더와 디코더가 있는 RNN 구조를 사용했다. 여태까지 최고의 성능을 내는 것은 attention 메커니즘을 이용해서 인코더와 디코더를 연결한 모델이다. 한편, 본 논문의 저자는 Transformer라고 하는, 순수하게 attention 메커니즘만을 이용해서 인코더와 디코더를 연결한 모델을 고안해낸다. 여기서 중요한 부분은 RNN(혹은 CNN) 구조로부터 완전히 벗어났다는 점이다. (dispensing with recurrence and convolutions entirely) 이러한 아키텍쳐를 구현함으로써 질적으로도 뛰어날 뿐 아니라, 계산의 병렬화를 가능하게 하여 훈련 시간의 단축이라는 쾌거를 이루어낼 수 있었다.
늘 느끼지만 초록에 모든 것이 있다..
1. Introduction
초록에서 sequence transduction model 을 언급했는데 이는 언어 모델링이나 기계 번역 같은 과제들을 수행하는 대표주자 RNN, LSTM, GRN 들을 뜻한다. 기계 번역은 어떤 과제인지 알 것이고, 언어 모델링은 그 쓰임새를 알면 이해하기 쉽다. 오탈자 검색이나 검색어 자동 완성, 즉 특정 character를 예측하는 것이 언어 모델링이 이용한 기능이다.
RNN의 구조를 떠올려보면 아래와 같다.
$y_{t}$를 예측하기 위해선 t-1 시점의 hidden state인 $h_{t-1}$와 입력 벡터 $x_{t}$를 input으로 이용한다. 하지만 hidden state를 계산하기 위해서는 t-2시점의 hidden state가 필요하고 또 그 전의 h-3, 이런 식으로 쭉쭉 거슬러 올라간다. 그렇기 때문에 기존 RNN 구조에서는 병렬화가 불가능했다. 왜? 전 단계의 정보가 필요하니까! (*병렬화가 중요한 이유는 한 번에 처리할 수 있다는 장점 덕분이다. 전 단계가 끝나야 다음 단계를 수행할 수 있는 게 아니고, 모든 단계를 동시에 각각 수행할 수 있으니까! 독립적이라고 말해도 될까. 하여튼 이러면 GPU를 이용할 수 있고 GPU의 힘을 얻어 더 빠르게 더 빠르게 계산할 수 있다.)
factorization trick, conditional computation 등을 이용함으로써 모델의 성능을 개선하고자 했지만, 근본적인 RNN의 한계를 극복하지는 못했다.
Attention 메커니즘은 입력과 출력의 순서와 상관없이 의존성을 학습할 수 있었기에(입력과 출력에 상관없이 항상 모든 hidden state를 고려하는 attention 메커니즘의 특징을 떠올리면 좋을 것 같다) 여러가지 task에서 이제 필수적인 메커니즘이 되었지만 여전히 recurrent network에 기대고 있다.
그래서 Transformer에서는 철저하게 attention 매커니즘을 사용함으로써 입력과 출력 사이의 전역 의존성을 끌어내고자 한다. 이를 통해 transformer에서는 병렬화가 가능해지고, 여덟개의 p100 GPU를 이용함으로써 더 좋은 성과를 이끌어낼 수 있었다.
2. Background
이렇게 sequential하게 계산되는 것을 줄이기 위해서 ByteNet, ConvS2S 같은 모델들이 고안됐으나, 이것들은 거리가 먼 값들 사이의 의존성을 학습려면 전자는 logarithmically하게, 후자는 linearly 하게 연산량이 늘어난다는 한계가 있었다. 반면에 Transformer같은 경우에는 계산량을 constant number로까지 줄일 수 있었다. 대신 attetion-weighted posiotion들을 평균을 내버리는 바람에 effective 해상도를 희생하게 된다. 이를 극복하기 위해서 Multi-Head Attention을 사용한다(이는 section 3.2에서 후술한다).
Self-attention(혹은 intra-attention)은 attention 메커니즘으로서, 한 sequence내 의 서로 다른 position을 연관 시켜서 sequence의 representation을 계산한다. 쿼리, 키, 그리고 value 값이 모두 동일한 attention이라고 생각하면 된다.
self attention은 크게 두 번 encoder, decoder에서 각각 등장하는데, 아래 그림과 같다.
self attention은 성공적으로 다양한 task를 해냈지만 여전히 RNN에서 분리되지 못하고 있었다. 하지만 Transformer는 최초로, RNN 혹은 합성곱 없이도 attention을 사용하는데 성공한 모델이다.
도대체 이 문장을 몇 번째 쓰는지.
3. Model Architecture
encoder에서는 $(x_{1}, x_{2}, \dots x_{n})$을 $(z_{1}, z_{2}, \dots z_{n})$으로 매핑해준다.
z가 주어지면 decoder는 output sequence $(y_{1}, y_{2}, \dots y_{m})$한 time step당 하나씩 출력한다.
각 스텝에서 모델은 전에 생성된 symbol을 다음번 output을 생성할 때 추가적인 input으로 사용하게 된다는 점에서 auto-regressive하다.
Transformer는 이런 인코더와 디코더를 6개씩 쌓은 구조이다.
3.1 Encoder and Decoder Stacks
encoder: 위의 사진처럼 생긴 동일한 6개의 encoder가 쌓여있다. 각 encoder에는 2개의 sub-layer가 딸려있는데, 사진을 통해서 알 수 있듯이 multi-head self-attention과 pointwise FC feed-foward layer이다. feed - foward layer는 순전파라고 생각하면 편하더라. 이때 이 sub-layer는 residual 하게 연결하며 layer normalization을 시행한다.
수식으로 표현하면 쉽다. LayerNorm을 함수 g(x)라고 하자. 그러면 $g(x+Sublayer(x))$ 이런 식이다. residual하게 x와 sub-layer를 거친 output을 더해서 normalization을 시행한다. 한편 residual한 connection이 제대로 작동하게 하기 위해서 output과 input의 차원을 동일하게 설정한다! $d_{model} = 512$ 그 차원은 512로 설정한다.
decoder: 디코더 역시 6개의 동일한 decoder를 쌓아 올린 것이다. 대신 디코더에서는 하나가 더 추가된다: Masked multi-head attention 이다. 왜 이게 필요하느냐?
ex. I'll go to school tomorrow.
라는 문장을 번역하면 나는 내일 학교를 가겠다. 가 될 것이다. 이건 인간번역이고, 기계번역을 상상해보자.
만약 지금 '나는 내일'까지 output을 출력했고 다음으로 '학교를'을 출력해야 할 때라고 생각하자. 그럼 디코더는 '가겠다'라는 sequence는 고려할 수 없다. 그러니까 지금까지 출력된 값들만 고려할 수 있다는 것이다. 따라서 현재 스텝 이후의 input sequence를 masking을 해준다.
즉, predictions for position i can depend only on the known outputs at positions less than i
3.2 Attention
**지금까지 쿼리, 키 , value에 대한 설명이 없었다..
위 사진을 참고하면 알 수 있겠지만, 쿼리, 키 value 도 결국은 sequence를 의미한다. (다만 위의 그림은 encoder의 self-attention layer이니 decoder의 masked self-attention이나 encoder-decoder attention layer은 스스로 상상해보면 좋을 것 같다... ㅎㅎ)
decoder와의 차이는 쿼리가 decoder의 input sequence이고, 키와 value는 encoder의 output이다. 섹션 3.2.3에서 나온다.
다만 논문의 흐름은 부수고 잠깐 내가 개입해서 왜 쿼리, 키, value 값들로 이런 많은 연산들을 하는지 내가 이해한 바로는,,
쿼리와 키 값을 곱하고 소프트맥스에 넣는 과정까지가 상관관계를 구하는 것과 유사하다는 인상을 받았다.
그래서 자기자신과의 attention score는 굉장히 높다! 당연하다. 기계 번역시에 내가 hi라는 단어를 번역할 것이라면 hi에 주목하는 것이 맞다. 하지만 그 외에도 추가로 참고하면 좋은 단어가 있다면 상관성이 높게 나타나야 하고 이가 곧 높은 attention score를 얻는 다는 뜻이다.
attention은 쿼리와 key-value 쌍을 output에 매핑한다고 설명할 수 있다. 이때 기억할 것은 쿼리, key-value그리고 output 모두 벡터이다.
output은 value들의 가중합으로 계산된다. 그럼 이때 가중치는 어디서 나왔느냐? 이것들은 쿼리와 이에 상응하는 key 사이의 compatibility function을 통해서 계산된다. compatibility function이란 무엇인가,,, 3.2.1에서 고민해보자!
3.2.1 Scaked Dit-Product Attention
본 모델에서 이용된 어텐션 메커니즘은 "Scaled Dot-Product Attention"이다. (어텐션에도 종류가 많다)
이때 input 은 $d_{k}$차원의 쿼리와 키, 그리고 $d_{v}$ 차원의 value 값이다. 이때 모든 쿼리와 키 값들을 내적하고, 이를 $\sqrt{d_{k}}$로 나눈다. 그리고 제일 처음 언급했던 어탠션 메커니즘처럼 이 값에 softmax 함수를 거쳐서 value에 가중해줄 값을 구하게 된다.
앞에서 벡터라고 했지만, 쿼리들을 동시에 계산하기 위해서 이를 matrix행렬의 형태로 묶는다: Q.
key와 value도 마찬가지다. 각각 K, 그리고 V가 된다.
행렬이 되었기 때문에 아래와 같이 쉽게 계산할 수 있다.
$Attention(Q,K,V) = softmax(\frac{QK^{T}}{\sqrt{d_{k}}})V$
어탠션 매커니즘으로 쓰이는 건 지금 언급한 닷 프로덕 어탠션도 있지만, 동시에 additive 어탠션도 있다. 엄밀하게 말하면 지금 언급한 닷 프로덕션 어탠션은 자주 쓰이는 건 아니다. 거의 비슷하지만, 여기 어탠션에서 특이한 term을 더했는데, 이가 바로 scaling factor, 그러니까 $\sqrt{d_{k}}$이다. 닷 프로덕 어탠션은 additive 어탠션에 비해 훨씬 빠르고 공간 효율적이다. 그래서 scaling factor를 더해서 닷 프로덕을 이용한 것 같다.
3.2.2 Mutli-Head Attention
단순히 어탠션 함수를 시행하는 것 보다는, 쿼리, 키 그리고 value를 h번 학습된 각기 다른 선형 projection을 이용하면 더 효율적이었다고 한다. 그래서 h번 projection을 하고, concatenate(이어 붙임)한 후에 다시 projection을 했다고 한다.
** projection이란?
추후 업로드 급한 불부터 끄자
내가 진짜 선대 듣고야 만다...
Multi head가 무엇인가? 아래 그림을 보면 이해가 쉽다. 독립적으로 서로 다른 어탠션 head를 계산을 뜻한다!
위에서 보이는 것처럼 $z_{0}$ 이런 친구들은 나중에 한꺼번에 하나의 행렬로 합쳐진다. 그 후에는 아래의 그림처럼 linear 한 layer를 거친다. (이후에 FFN layer를 거치기 때문인듯)
Multi-head attention을 시행함으로써 얻는 장점은 무엇인가?
jointly attend to information from different representation subspaces at different positions.
$MultiHead(Q,K,V) = Concat(head_{1}, head_{2}, \dots, head_{h}) W^{O}$
이때 $head_{i} = Attention(QW^{Q}_{i}, KW^{K}_{i}, VW^{V}_{i})$
이때 h는 8로 설정했는데, total 계산 비용은 single-head attention을 한 것과 크게 차이가 없었다. 왜냐하면 다 계획이 있거든! 이를 위해서 $d_{k} = d_{v} = d_{model}/h = 64$를 각 head의 차원을 축소시켰다.
흠 그래서 지금까지 살펴본 인코더 내부는 아래와 같이 정리할 수 있다!
정말이지 이해하기 쉬운 figure다.
3.2.3 Applications of Attention in our Model
- "encoder-decoder attention" layer에서 쿼리값은 전 디코더 layer의 값이고, key와 value 값은 인코더의 output이다. 이렇게 쿼리, 키, value 값을 구함으로써 디코더 값을 출력할 때 항상 모든 input sequence 값을 고려하게 된다는 것이다.
- 인코더는 self-attention layer를 포함한다. 이때 쿼리, 키, value 값은 모두 동일하게 encoder의 전 layer output이다.
3.3 Position-wise Feed_Foward Networks
$FFN(x) = max(0, xW_{1} + b_{1})W_{2} + b_{2}$
이 FFN은 서로 encoder layer마다 독립적이지만 동일한 방식으로 적용되는데 두 번의 linear transformation과 활성화 함수 ReLU(:max 부분)를 거치게 된다. 다만 이때 각 layer마다 서로 다른 parameter를 사용한다.
3.4 Embeddings and Softmax
learned embedding을 이용해서 input 토큰과 output 토큰을 벡터로 바꿨으며, 학습된 linear transformation 및 softmax 함수를 이용해서 decoder output을 예측된 다음 토큰의 확률을 계산하는데 이용했다고 한다.
본 모델에서 두 임베딩 레이어에서는 동일한 가중치 행렬, pre-softmax linear transformation을 이용하고 있다. 임베딩 레이어에서는 그 가중치에 $\sqrt{d_{model}}$을 곱해주었다고 한다.
(*임베딩: 단어를 벡터로 표현하는 방법 ex word2vec)
3.5 Positional Encoding
이 모델에서는 RNN이나 CNN을 사용하지 않고 있는데, 이로 인해서 transformer에서는 새로 고려해야 할 부분이 있다. 바로 지금 내가 몇 번째 sequence를 읽어들이고 있는가, 이다. 따라서 이를 함께 고려해주기 위해서는 현재 sequence의 상대적 혹은 절대적 위치를 참고해야 한다. 이가 곧 "positional encodings"이다.
이는 input을 임배딩할 때 해주게 된다. 개념적으로 표현하면 아래 그림과 같다.
실제 transformer에서 사용한 것은 sine과 cosine함수였다고 한다.
위 함수를 통해서 학습 데이터보다 긴 sequence의 데이터도 잘 처리할 수 있는 결과를 기대했다.
($\because$절대적 위치 참조가 아닌, 상대적 위치 참조라서 그렇다고 한다.)
4. Why Self-Attention
self-attetion과 여타 RNN 등을 비교하기 위해서 크게 3가지 기준을 세웠는데 각각, (1) 각 레이어당 총 연산량 (2) 병렬화될 수 있는 연산량: sequential한 계산량을 기준으로 측정했다 (3) 네트워크에서 긴 길이의 dependencies 사이의 경로 길이: 이 길이(paths between any combination of positions in the input and output sequences) 가 짧을수록 긴 길이의 dependencies를 학습하기 쉽다고 한다.
위 Table을 통해서 알 수 있듯이, self-attention은 (1), (2), (3) 기준에서 보다 좋은 성능/ 조건을 가지는 것으로 보인다. 덧붙여서, 본 모델이 가지는 다른 장점은 "interpretable"하다는 것이다. 앞에서 봤듯이 self-attention은 여러 번 시행하게 되는데(multi-head) 이때, 각 head 마다 기능이 다를 뿐 아니라, 대부분이 syntactic하고 semantic한 문장 구조와 관련된 task도 잘 수행한다는 것이다. 부록에 있는 내용을 슬쩍 가져와보겠다.
왼쪽과 오른쪽은 각각 laye5와 6의 self0attention 인코더에서 가져온 다른 head라고 한다. 보면 서로 다른 방식으로 문장 구조에 접근하고 있다. 이 말인즉슨, 문장의 구조와 관련된 서로 다른 역할을 수행하고 있다는 것이다.
5. Training
5.1 Training Data and Batching
읽어보길 바란다. 어떤 데이터를 train하는데 사용했고, batch는 어떻게 구성했고에 대한 내용이다.
5.2 Hardware and Schedule
P100 GPU를 8대 썼다고 한다. (드디어 내가 아는 GPU이름이 나왔다! GCP에서 봤을때 꽤 비쌌는데 8개라니..)
5.3 Optimizer
아담 optimizer를 이용했다.
$\beta_{1} = 0.9, \beta_{2} = 0.98, \epsilon = 10^{-9}$
lr은 training을 하면서 아래의 식에 따라 조율해줬다.
$l_{rate} = d_{model}^{-0.5} \dot min(step_num^{-0.5}, step_num \dot warmup_steps^{-1.5})$
warmup_steps = 4000
5.4 Regularization
총 3가지의 regularization
- Residual Dropout : sub-layer의 input에 더해지고 normalized되기 전 각 sub_layer에서 drop out을 시행했다. 이때 drop out의 확률은 0.4
- label smoothing: $epsilon_{ls} = 0.1$
예를 들어 '개'라는 단어를 원핫 인코딩을 통해 벡터로 바꿨을 때 [1,0,0,0,....0]이고 '고양이'라는 단어를 벡터로 바꿨을 때 [0,1,0,0,...0]이라고 하자. 훈련을 할 때 저 벡터값을 그대로 넣으면 너무 loss가 커지기에(혹은 엄격하게 훈련한다고 받아들여도 괜찮을 것 같다) 좀 깍아준다는 것이다. '개'라는 단어는 [1,0,0,...0] 대신에 [0.95,0.02,...] 뭐 이런 식으로. 위에 적은 입실론은 이 깍는 비율 정도라고 생각하면 될 것 같다.
자세한 설명은 여기서 ! https://3months.tistory.com/465
근데 내가 못 찾는 건지 모르겠지만 아무리 봐도 이 섹션에서 나머지 하나 regularization은 못 찾겠다. 분명히 three type라고 했는뎁슈
6. Results
6.1 Machine Translation
base model만 이용해도 기존의 모델 성능을 뛰어넘는다.
또, 훈련을 할 때 beam search를 이용했다고 하는데 이해한 걸 쉽게 표현해 보겠다..
우리는 보통 output sequence를 만들 때 softmax 함수를 거친 값들 중 가장 높은 확률값을 갖는 애를 갖고 나머지는 버린다고 생각한다. 하지만 그 대신에 후보를 한 여러 명 두는 것이다. 후보마다 다 output을 특정 차례까지 만들어보고, 개중에서 가장 에러율이 낮은 애를 채택하는? 그런 방식이다. 이때 본 모델에서는 beam 사이즈가 4였다고 한다.
수치화된 결과는 직접 표를 통해서 확인!
6.2 Model Variations
모델이 어떤 요소 혹은 기능이 중요한지 파악하기 위해서 이거는 빼보고 저거는 넣어보고 이렇게 여러 번 실험했다고 한다.
위의 table에서 (B) 번째 row를 보면 어텐션 키 사이즈인 $d_{k}$를 줄이면 모델의 성능이 떨어지는 것을 확인할 수 있다. 이러한 결과로 미루어보았을 때, residual을 시행하기 위해서 설정했던 compatibility는 좀 더 정교한 시행이 필요함을 짐작할 수 있다. 단순히 닷 프로덕을 하는 것 보다.
6.3 English Constituency Parsing
잘은 모르지만 CV 분야를 예로 들면 classification에서 좋은 성능을 보인 모델을 object detection에 써본 것 같은 섹션이다. GoogLeNet처럼..
task -specific한 튜닝 없이도 이 모델은 아주 잘 성능했다고 한다.
7. Conclusion
여하튼 가장 쉬운 결론.
RNN 과 같이 sequential한 계산이 많이 필요한 모델을 버리고 온전히 어텐션 메커니즘만 이용해본 첫 시도인 모델인 Transformer을 살펴보았다. 훨씬 더 빠른 속도로 학습이 가능하면서 동시에 훨씬 좋은 성능을 낼 수 있었다는 점에서 가히 주목할 만한 모델이다.
사족
내가 읽은 faster rcnn은 언제 업로드 하나...
바쁘다 바빠 현대 사회
내일 안에 하나 다 읽고 또 올릴 수 있을까?
올리는 것 까지 하는 게 키포인트다
실은 안 해도 될지도 모르지만 공부한게 너무 아깝잖아ㅜㅜ
이번에 포스팅 하면서 딴 짓을 너무 많이 했다.. 그리고 급박해서..
놓친 부분이 많을 수 있고, 부족한 부분이 많다고 생각된다.
추후에 고치기 위해서 노력하겠지만 잘못된 부분은 서스럼없이 지적해줬으면 좋겠다. 제발~
여기까지 읽느라 수고하셨습니다!!
'딥러닝 > CV 논문' 카테고리의 다른 글
[Object Detection] YOLO (0) | 2021.08.03 |
---|---|
[Classification] ViT: Vision Transformer (0) | 2021.07.29 |
[Classification] GoogleNet (0) | 2021.07.19 |
[Object Detection] Fast R-CNN (0) | 2021.07.07 |
[Object Detection] R-CNN (3) | 2021.06.05 |
댓글