오랫만에 글을 또 쓰게 되었다. 언어모델쪽은 지켜보기만 하고 있었는데, 흥미로운 소식을 듣고 글을 써본다.


여러가지 벤치마크에서 자기보다 덩치가 더 큰 모델들을 능가하는 성적을 냈다고 주장하는 Mistral 7B 가 화제다.


벤치마크 성적을 갖고 자사의 모델이 우수하다고 주장하는 경우들은 워낙 많이 있지만 많은 경우 내용을 살펴보면 실망스럽다.


왜냐하면 주요 벤치마크들의 데이터셋들은 이미 공개되어 있기 때문이다. 공개된 데이타의 답안에 과적합시키는 것에는 특별한 기술이 없이도 과적합만으로도 목적을 달성할 수 있다. 


검증용세트의 데이터는 학습용 데이터에 포함시키지 않는 것은 데이터 과학 연구자의 가장 기초상식이라고 할 내용이겠지만 이런부분이 완전하게 잘 지켜지고 있지 않는 사례들이 많았다. 실제로 일부 모델들은 점수를 공개했다가 실제 사용사례에서는 기대만큼의 성능이 안나오자 데이터셋 오염을 인정하고 발표를 철회하는 경우들도 있다. 이런경우는 그나마 양심이 있는 경우이고 자사의 독자적인 기술력으로 높은 점수를 받았다고 주장하지만 발표한 논문도 없고, 데이터셋이 오염되지 않았다는 것을 입증하지도 않는 경우들도 있으니 비전문가의 입장에서는 단순한 벤치마크 점수는 주의할 필요가 있다. 


비유하자면 이건 일타강사가 자기의 강의를 들으면 2022년도 수능 시험에서 아주 높은 점수를 받을 수 있다고 주장하는 것만큼이나 무가치한 주장이다.



그럼에도 불구하고 Mistral 7B 는 여러모로 눈에 띄었는데, 일단 논문을 발표한 저자들중에 LLaMA 1 모델의 개발에 참여했던 멤버가 보였기 때문이다. 또한 Sliding window attention (SWA) 이라는 방식을 채용해서 성능을 끌어올렸다고 하니, 이 내용에 대해 알아보도록 하자.


먼저, SWA 라는 모델의 개발에 영향을 준 Sparse Transformer 논문을 알아보자. 논문의 3번째 저자는 OpenAI 의 그 아저씨다.


https://arxiv.org/abs/1904.10509

1. 트랜스포머의 구조는 임의의 길이를 다룰 수 있는 능력이 있지만 컨텍스트의 길이에 따라 계산량이 길이의 제곱에 비례해 늘어난다는 단점이 있다.

   - 예를 들어 100 토큰짜리 시퀀스를 계산할 때에는 총 계산량은 대략 1+2+3+4+5+...100 = 5050 에 비례한다. 각 토큰마다 다음 토큰을 예측하기 위해서는 그 토큰의 앞에 있는 모든 토큰에 대해 어텐션 계산을 해야 하기 때문이다. 그것을 트랜스포머 레이어마다 해야 하고, 또한 멀티어텐션의 각각 헤드마다 수행해야 한다.

2. 이 논문에서는 희소행렬분해 (sparse factorization) 을 통해 제곱 ( = O(n^2)) 에 비례하는 계산량을 (= O(n*sqrt(n)) 수준으로 낮추는 방법을 제시한다


논문에서는 트랜스포머는 언어모델, 음성 파형, 텍스트, 시계열 수치 데이터 등의 다양한 패턴을 포착할 수 있는 만능 구조이기 때문에, 희소행렬분해라는 기법을 쉽게 시각화할 수 있는 대상으로 비전 태스크를 예시로 선택해서 보여주고 있다



트랜스포머의 각 레이어별로 어텐션 연산이 일어나는 양상을 예제 그림을 통해 살펴보자. 위 그림에서 흰색은 어텐션의 대상이 되는 부분을 강조해놓은 것이고, 검은색은 아직 디코더가 처리하지 않은 부분을 마스킹해놓은 부분을 표시한 것이다.

트랜스포머를 이미지 인식용으로 사용할 때는 2차원 그림을 한줄로 쭉 늘어놓은 1차원배열의 형태로 컨텍스트를 만들어서 넣으면 알아서 2차원의 형태에 적응하는 모습을 보여주는데, 그 적응의 양상은 레이어별로 달라진다.


 a) 초반의 트랜스포머 레이어들은 CNN 모델의 합성곱과 유사한 효과를 발휘하는데, 국소적인 연결형태들을 주로 파악한다. 예를 들면 직선, 곡선, 뾰족함, 완만함 등의 특질(feature) 들에 주목한다. 위의 그림중 a) 에 해당하는 부분의 하얀색 (어텐션의 대상이 되는 부분) 을 보면 현재 디코딩중인 부분의 가까운 부분에만 모여있는 것이 보인다


 b) 19-20번쯤의 중간 레이어들을 보면 흰색의 가로줄과 세로줄이 쳐진 것을 볼 수 있다. 이것은 트랜스포머가 1차원 컨텍스트에서 2차원 구조를 파악했다는 증거이다. a)에서는 가까운 곳의 구조만 봤다면 이제 중간 레이어쯤에서는 가로 세로축을 중심으로 더 먼곳까지 어텐션을 하기 시작했다는 것을 의미한다.


 c) 몇몇 레이어들은 더 특수한 전체적 패턴들을 포착하기 시작한다. 예를 들면 새의 윤곽선에 해당하는 부분에 어텐션을 하고 있는 것을 볼 수 있다. 


 d) 뒤쪽의 레이어들은 특수한 경우에만 어텐션을 하고 보통의 경우에는 잘 활성화되지 않는다.



이것들의 의미하는 바를 정리하자면


 트랜스포머 모델에서는 각 레이어마다 의미있는 어텐션의 범위가 달라진다


라고 할 수 있다.



다시 의미를 생각해보자. 트랜스포머 모델에 이미지들을 학습시키자 초반 레이어들은 알아서 자기 가까운 곳의 구조에 주목하기 시작했고, 초중반 레이어들은 구조적으로 좀 더 먼 곳, 중반 레이어는 전체적인 구조, 그 이후의 레이어들은 필요할때만 전체적인 구조에 주목했다. 


다르게 말하자면, 아무리 컨텍스트를 길게주더라도 초반 레이어들은 자기로부터 가까운 곳 이후의 데이터를 줘봤자 낭비라는 것이다. 


여기서 생각할 수 있는 최적화 아이디어 = 트랜스포머의 레이어마다 어텐션의 범위를 다르게 해주자. = 앞쪽 레이어에는 짧게, 뒤쪽 레이어로 갈 수록 길게..


이게 희소 어텐션의 기반이 된 아이디어라고 할 수 있다.


비전모델이 아니라 언어모델의 관점에서 생각해보자. 



우리가 글을 쓰는 트랜스포머라고 생각해보자. 올바르고 의미있는 글을 쓰려면

1) 문법이 맞아야 하고

2) 논리가 맞아야 하고

3) 전체적인 주제에 부합해야 한다.


문법이 맞는다라는 부분은 트랜스포머의 초반 레이어에 해당할 것이다. 비전 트랜스포머에서 초반레이어가 합성곱 필터를 이용해서 둥글다, 각지다, 곡선이다, 사선이다, 직선이다 같은 기초적인 특질을 파악하는 것처럼 언어모델에서는 Noun 다음에는 verb 가 올 확률이 높다던가 하는 식의 구조를 학습한다. TinyStories 같은 논문에서 트랜스포머로 기초적인 언어모델을 만들때 문법을 익숙해지는 것은 상대적으로 초반에 적은 토큰을 갖고도 쉽게 학습이 되는 부분이었다.


문법을 맞추기 위해서는 내가 어떤 단어를 썼었고, 그 다음에 적당한 다음 단어를 써야하는데, 최근의 단어는 길게 알 필요가 없다. 아무리 긴 글을 쓰고 있는 도중이라고 하더라도 문법이라는 측면에서는 최근의 단어만 알아도 된다. 


논리적인 문장을 맞으려면 조금은 더 길게 봐야 한다. 예를 들면 영어단어에서 구절, 댓구 같은 것을 완성할 때에 여러단어 앞쪽에서 사용한 접속사 (not only 가 앞쪽에 나왔으면 다음 구절에서는 but also 같은 것이 나와줘야 한다) 가 짝이 맞아야만 자연스런 문장이 될 것이다. 이부분은 초중반 레이어라고 할 수 있다. 아까보다는 좀 더 넓은 컨텍스트에 주목해야 하지만 보통의 문장의 길이보다 훨씬 더 크게 어텐션 대상을 잡을 필요는 없다.


전체적인 주제의 흐름을 알기위해서는 이제 좀 더 본격적인 특질에 신경써야 한다. 비전트랜스포머에서 외곽선을 담당하는 어텐션 헤드가 생겼던 것처럼, 어떤 인물에 대한 글을 쓰고 있는 중이라면 그 인물의 특징을 제시한 중요한 단어 (예: 절름발이) 를 빼먹지 말고 나중에 써먹어야 한다. 이쯤되면 중반부터 후반레이어에 해당하는 부분이다. 이제는 주어진 컨텍스트 범위를 최대한 써먹어야 한다. 사소한 단어 하나라도 빼먹어선 안되며, 토큰의 존재뿐 아니라 순서도 중요하기 때문에 포지션 인코딩이 조합된 결과에 대해서도 촉각을 곤두세워야 한다.



요 원리를 이용해서 모델의 구조를 짜고 학습을 시키면, 긴 컨텍스트 길이를 뽑으면서도 추론속도가 N^2 으로 늘어나는 것을 막을 수 있다는 것인데, 이걸 좀 더 적극 활용해서 O(N*sqrt(n)) 이 아니라 아예 O(N) 으로 만들어버릴 수는 없을까? 여기부터가 Sliding window attention 에 대한 내용이다.


SWA 의 원리에 대해서는 제작자들은 짧게만 소개하고 있는데, 내용 자체는 그림 한장으로 요약할 수 있을 정도로 간단하다.



그림을 보면 : 레이어의 위로 갈 수록 어텐션의 범위가 뒤로 옮겨지는 것을 볼 수 있다. 점점 넓은 범위를 훑는 방식이 아니라 레이어별로 훑는 분량은 일정하게하면서 범위를 뒤로 slide 시켜주는 것이다. 


이전의 비전트랜스포머의 경우에서 보았듯이 뒷부분 레이어는 자주 활성화되지 않고 특별한 특질이 있을때만 활성화되는데, 이말인 

즉슨 많은경우 뒷부분 레이어들이 할 일없이 놀고 있다는 뜻이기도 하다. 그러면 놀지 못하게 하려면 일을 시켜야 한다. 왜 노는가? 축구로 치자면 수비수가 너무 일을 잘해서 골키퍼가 할 일이 없는 식인 것이다. 축구장의 자기 구역에 대해서만 따라가고 자기구역을 넘어가면 그냥 관심을 가지지 않게 하면 각 구역별 담당자가 알아서 열심히 일을 할 것이다.


그래서 레이어마다 일정하게 쪼개서 계속 뒷부분에 대해 어텐션을 하게끔 시키는것이다. 이렇게 해도 효과가 있을까? 충분한 어텐션 성능을 발휘할 수 있을까?


아마 그게 되었기 때문에 이 모델의 제작자들이 높은 벤치마크의 성능을 자신있게 내보인 것 같다. 아파치 라이센스의 모델로 코드와 모델을 공개했으니 검증은 오래걸리지 않을 것이다.


다만 어떤 데이터셋을 썼는가에 대해서는 정확히 밝히고 있지 않은데, 뇌피셜이긴 하지만 제작자가 LLaMA 모델의 저자로 참여했던 만큼 뭔가 관계가 있을 수도 있기 때문에 모델의 출처에 대해 못밝히는 것은 아닌가 하는 생각이 든다.




그럼 이만.