논문명: Mixtral of Experts
학회(출판연도): arXiv (2024)
연구분야: Large Language Models (LLM), Mixture of Experts (MoE), Efficient AI
Mixtral 8x7B라는 Sparse Mixture of Experts(SMoE)기반 언어모델 제안
입력 → FFN으로 모든 FFN을 항상 계산함입력 → Router → Expert1 Expert5 처럼 필요한 Expert만 선택해서 계산해서 계산량이 크게 줄어듦Mixtral은 기본적으로 Mistral 7B와 동일한 구조를 사용하지만, 각 Transformer layer의 FFN 대신 8개의 Feed Forward Network(Expert)를 둔 것이 차이점
Attention → FFNAttention → Expert1 Expert2 Expert3 Expert4 Expert5 Expert6 Expert7 Expert8각 토큰이 각 layer를 통과할 때마다, Router가 8개의 Expert 중 2개를 선택하고 선택된 Expert의 출력을 합쳐서 다음 layer로 전달
Expert2 Expert6Expert1 Expert8✓ 왜 13B일까?
Mixtral은 Expert x 8이 있지만, Top-2만 계산함
즉, 전체 파라미터는 47B이고 실제 계산은 Expert 2개 ≈ 13B
⇒ 큰 모델의 표현력과 작은 모델 수준의 계산량을 동시에 얻을 수 있음
또한 Mixtraldms 32,000토큰의 긴 문맥을 처리할 수 있도록 학습됨
대부분의 벤치마크에서 Llama2 70B와 GPT-3.5 이상의 성능을 보임
instruction tuning을 수행한 Mixtral 8x7B-Instruct도 함께 공개
사람이 평가한 벤치마크에서는 GPT-3.5 Turbo, Claude 2.1, Gemini Pro, Llama 2 70B Chat 보다도 높은 평가를 받음
본 논문에서는 Mixtral 8x7B 라는 Sparse Mixture of Experts(SMoE)기반의 오픈소스 언어모델을 소개함(Apaceh 2.0 라이선스)
✓ SMoE(Sparse Mixture of Experts)**
- MoE(Mixture of Experts)
- 여러 개의 작은 전문가 모델(Expert)를 만들고, 입력마다 적절한 전문가만 선택해서 사용하는 구조
- 라우터가 “누가 이 입력을 처리할지”를 결정함
- Sparse
- 모든 Expert를 사용하지 않고 일부 Expert만 사용한다
Mixtral은 Sparse Mixture-of-Experts 네트워크
GPT랑 똑같이 Decoder-only Transformer 구조이고, FFN(Feedforward block)부분에서 8개의 Expert 중 필요한 것만 선택함
✓ Transformer란?
현재 대부분의 LLM의 기반이 되는 모델로, 기본적인 구조로는 입력 문장 — Encoder(여러 층) — Encoder Output — Decoder(여러 층) — 출력 문장
!image.png
✓ Encoder은 무슨 역할을 할까?
입력 문장을 이해하는 것
예를 들어,
The cat sat on the mat.이라는 문장이 들어오면, 인코더에서는The → 벡터,cat → 벡터처럼 단어를 숫자로 바꿈
각 단어가 무엇을 의미하는지, 다른 단어와 어떤 관계인지 학습
→ 그래서 BERT, RoBERTa 같은 모델을 사용함
✓ Decoder은 무슨 역할을 할까?
- 다음 단어를 생성하는 것
- 예를 들어,
오늘 날씨가가 입력되면, 디코더에서는좋네요를 예측함. 이후좋네요를 생성하고 다음 단어를 생성
✓ 그러면 왜 GPT는 Decoder만 사용할까?
원래 트렌스포머는 Encoder → Decoder 구조 이지만, GPT의 경우에는 Decoder만 사용함
왜냐하면, GPT의 목표는 “다음 단어 맞추기” 이기 때문
입력을 별도로 압축해서 전달할 필요가 없기 때문에 인코더를 제거함
→ GPT, Llama, Mistral, Mixtral 모두 디코더 온리 모델
디코더 layer 하나를 보면,
input→self attention-FFN→output구조인데 이 layer가 여러번 반복됨
- self attention: 문장 안에서 어떤 단어가 중요한지를 찾는 과정
- FFN: 작은 신경망(MLP)
- 입력 → linear → activation → linear → 출력
Attention과 FFN의 차이?
- attention은 단어들끼리 관계를 찾는 것을 의미
- FFN은 attention이 만든 표현을 더 좋은 표현으로 변환하는 것
- 그래서 attention은 정보를 모으는 역할, FFN은 정보를 가공하는 역할
Mixtral에서는 FFN 하나가 하던 일을 여러개의 FFN(Expert)로 나눔(각 Expert는 독립적인 FFN)
- 전체 구조를 살펴보면,
- self-attention(다른 토큰과의 관계) → Router(어떤 Expert를 사용할지) → Top-2 Expert(각 Expert는 하나의 FFN) → 선택된 두 Expert 출력 가중합 → 다음 Decoder layer


입력 에 대한 MoE 모듈 출력은 Expert들의 출력을 가중합해서 계산되며, 그 가중치는 Gating Network(라우터) 출력으로 결정됨
⭐️ 만약, Gating Vector가 Sparce하다면, Gate가 0인 Expert는 계산하지 않아도 됨 → 연산량 크게 줄어듦
를 구현하는 방법은 여러 가지가 있지만, 간단하면서도 성능이 좋은 방법은 Linear layer의 Logit에 대해 Top-K softmax를 사용하는 것
Expert 개수(n)를 늘리고 K를 그대로 유지하면, 모델 파라미터 수는 증가하지만, 계산 비용은 거의 일정하게 유지됨
MoE layer는 Expert가 여러개라서 느릴 것 같지만, 고성능 특수 커널(GPU에 특화된 연산 방식)을 사용하면, 단일 GPU에서도 효율적으로 실행 가능
MoE layer를 실행할때 특정 Expert가 처리해야하는 토큰은 해당 Expert가 있는 GPU로 전달되고, 처리가 끝난 후, 원래 위치로 반환
✓ 이렇게 Expert가 균등하게 사용되면 전문성이 떨어지는 것은 아닐까?
MoE는 2가지 목표를 동시에 만족해야함
각 토큰에 적합한 Expert를 선택해서 성능을 높인다
Expert 사용이 한쪽으로 쏠리지 않게 해서 계산 효율을 유지한다
⇒ 그래서 실제 학습에서는
Load Balancing Loss를 추가하여 특정 Expert만 계속 선택되는 것을 막음그렇다고 모든 Expert를 동일한 빈도로 사용하는 것은 아니고, Specialization과 Balance 사이의 적절한 타협점을 찾는 것이 핵심!
Transformer 모델에서 MoE layer는
Expert를 선택하고, 기존의 FFN 대신에 MoE를 넣음Mixtral에서는 Expert 함수 로 SwiGLU구조를 사용하고, 여기서 K는 2를 선택함
이때 Expert는 Linear → SwiGLU → Linear 구조를 가지고 있음 → 즉, FFN과 거의 동일한 구조 but 차이점은 이게 1개가 아니라 8개라는 점
✓ SwiGLU?
SwiGLU =
Swish+GLU(Gated Linear Unit)를 결합한 활성화 함수 구조먼저 Transformer의 FFN구조를 보면 일반적인 Transformer의 FFN은 보통
입력x → Linear 1 → Activation → Linear2 → 출력와 같이 생김
- Linear: 입력 벡터를 다른 공간으로 변환함
- 768차원 → 3072차원 처럼 차원을 키움 (더 많은 특징을 표현하기 위함)
GLU는 일반적인 FFN에 Gate를 한 추가하는 구조
→ 일반적은 FFN의 경우에는 모든 특징을 동일한 방식으로 처리하지만, GLU의 경우에는 입력을 2번 Linear하여 하나는 실제 정보, 다른 하나는 그 정보를 얼마나 사용할지 결정하는 Gate가 있음(즉, 중요한 특징만 getget!)
- ⭐️ 왜 그냥 Attention만으로 안되는지 의문이 생길 수 있는데, Attention의 경우에는 토큰 간의 관계를 학습하고, GLU의 경우에는 그 feature마다 사용량을 조절함
✓ 예시를 들어보자면,
Attention
- I love BOAZ라는 문장이 있다고 할 때, love의 경우 I와 BOAZ를 많이 참고함
GLU
love라는 벡터 안에는 수천 개의 feature가 존재하는데 그 GLU가 그 feature마다 사용량을 조절함
→ 벡터 내부 특징 조절
입력이 두 갈래로 나뉨
→
- : 정보부분 — 이 정보를 전달할까?
- : Gate부분 — 얼마나 열어줄까?
Swish(SiLU)는 Google이 제안한 활성화함수
- 중요한 값을 통과시키고 중요하지 않은 값은 줄이는 부드러운 Gate 역할
⭐️ 그렇다면, SwiGLU는?
- GLU의 Gate부분의
sigmoid를Swish로 수정
- Gate가 있는 활성화 함수 부분
- FFN은 구조이므로, 위와 같은 식이 논문에 적혀 있는 것
- 은 첫번째 변환으로 를 진행한 후 Swish를 적용
- 는 Gate 역할, GLU의 핵심이고 “얼마나 통과시킬지”를 결정함
- 는 출력 projection으로 곱한 결과를 다시 원래 차원으로 돌리는 역할
✓ 왜 SwiGLU?
- 기존의 FFN은
하나의 변환 → Activation → 출력이었다면,- SwiGLU는
2개의 변환 → 하나는 정보, 하나는 조절 → 결합구조이므로, “어떤 정보를 얼마나 사용할지”를 더 세밀하게 학습할 수 있음
✓ Mixtral에서 SwiGLU는 어디에 들어갈까?
Mixtral 구조
- Token → Attention → Router → Expert 선택 → Expert FFN → 출력
- 여기서 Expert = SwiGLU FFN임
- 즉, Expert마다 Linear → SwiGLU → Linear 과 같은 구조
그러면 SwiGLU와 MoE는 무슨 관계인지!
SwiGLU는 FFN 내부 구조 개선 목적 → FFN을 어떻게 더 잘 만들지
MoE는 FFN을 여러 개 만들고 선택 → FFN을 여러 개 두고 어떤 것을 사용할지
⇒ 즉, SwiGLU는 Swish 활성화 함수와 GLU의 Gate 구조를 결합한 FFN 구조로, 중요한 정보를 선택적으로 통과시키는 능력을 높이는 방식임. Mixtral에서는 각 Expert가 하나의 SwiGLU기반 FFN으로 구성되고, Router가 각 토큰마다 8개의 Expert 중 2개를 선택함
이 구조는 GShared와 유사한데, Mixtral의 경우





Passkey Retrieval 이라는 테스트를 진행함Passkey Retrieval은 긴 프롬프트 안에서 무작위로 삽입된 Passkey를 모델이 찾아낼 수 있는지를 측정하기 위한 Synthetic task임

Mixtral이 context의 길이나 passkey의 위치와 관계없이 100%정확도 달성(모두 초록색 1.0)
Proof-Pile 데이터세트의 일부에서 Context 크기가 증가할수록 Mixtral의 Perplexity가 단조적으로 감소함
즉, 문맥을 더 많이 보여줄수록 더 정확하게 다음 단어를 예측했다는 의미임
✓ Perplexity?
LLM이 다음 단어를 얼마나 잘 맞추는지를 측정하는 지표임
이는 작을 수록 좋은데,
PPL 의미 100 매우 나쁨 20 보통 10 좋음 5 매우 좋음
질문-답변 구조인데, BOLD는 문장을 생성함Instruction dataset를 사용하여 supervised fine-tuninig(SFT)을 수행한 후,
Paired Feedback Dataset을 사용하여 Direct Preference Optimization(DPO)을 적용하여 Mixtral-Instruct를 학습시킴
⇒ 사람이 작성한 좋은 예시를 따라 배우고(SFT), 그 다음에는 사람이 더 선호하는 답변을 선택하도록(DPO) 추가학습


⇒ ❓ 그러면 어디에 특화된거지?
- Expert분포는 DM Mathematics에서만 다르게 나타났음, 근데 차이가 그렇게 크진 않았음
- 수학이라서 생긴 차이라고 보진 않았고, 그냥 데이터세트가 인위적이라서로 판단
- Expert분포의 경우에는 첫 번째 layer와 마지막 layer에서 특히 차이가 두드러졌음
- 이 layer들의 hidden state는 각각 입력 임베딩과 출력 임베딩이 매우 높은 상관 관계를 갖기 때문
- layer0의 경우에는 거의 입력 단어 그 자체이고(DM Mathematics의 특이한 입력 구조가 그대로 반영됨)
- layer 31의 경우에는 거의 출력 단어 직전 상태임(수학 토큰 같은 특수 출력이 반영됨)
⇒ 즉, 그 차이가 가장 잘 드러나는 위치가 맨 앞과 맨 뒤 층이라는 것
⇒ 이는 Router가 일정한 구문적 행동을 보인다는 것을 시사함- 수학인지, 철학인지를 보는게 아니라 문법(구문)을 보고 있다는 것!!
✓ 왜 이런 결과가 나왔을까?
FFN은 문장을 이해하는 곳이라기보단, 각 토큰의 표현을 변환하는 곳임
도메인 정보의 경우에는 Attention에서 처리될 가능성이 존재함
즉, FFN(MoE)은 “이 토큰이 어떤 종류의 표현 반환을 필요로 하는가?”에 더 집중할 가능성이 있음
- 식별자, 들여쓰기, 함수호출, 조사 및 관사 처럼 비슷한 구조를 가진 토큰은 서로 비슷한 변환이 필요할 수 있음
- 때문에 router가 구문적 특징을 기준으로 Expert를 선택하는 것이 자연스러운 결과라고 볼 수 있음
좀 더 자세히 설명해보자면~
Transformer
- 하나의 layer에서는 input → multi-head self-attention → feed forward network(FFN) → output
Mixtral
Attention → MoE(=여러 Expert FFN)으로 바뀜
⇒ 즉, Attention은 FFN만 Expert 여러 개로 바뀐 것
Attention은 토큰끼리의 관계를 보는 곳임 → 즉, 문맥, 의미, 토큰 간의 관계를 만드는 것이
어텐션반면, FFN은 토큰 하나를 독립적으로 변환하는 역할 → Attention이 끝나면 각 토큰은 이미
cat → "고양이 + 주변 문맥"을 가지고 있음→ FNN은 그래서 이 표현을 더 좋은 표현으로 바꾸는 역할을 함(벡터를 더 유용한 벡터로)
- 입력이
self라고 하면, Attention이후에는 “python 코드 안의 self” 라는 의미를 가지고 있는데, FFN은 이 벡터를 더 코드에 적합한 표현으로 변환하는 역할
- self → python 변수 → 클래스의 인스턴스 변수
그러면 왜 self를 항상 같은 Expert가 처리를 할까.
- router가 “python 코드다!!” 를 본게 아니라
”self라는 토큰은 항상 비슷한 표현 변환이 필요하네” 라고 학습했을 가능성이 있기 때문이다.
✓ 그런데, 논문을 보면 self, 들여쓰기 와 같은 토큰은 Expert로 가는데, dog나 biology처럼 의미를 담고 있는 단어들은 같은 Expert로 가지 않는다. 왜 그럴까?
일단 먼저, Router의 목표는 무엇일까?
수학 → 수학 Expert라고 생각하지만, 실제로는 그렇지 않음
router은 도메인을 분류하는 모델이 아니다.
⇒ Router의 목표는 “이 ‘토큰’을 가장 잘 처리할 Expert가 누구인가”
예를 들면, python 코드가 아래와 같이 있다고 하자.
class Dog:
def bark(self):
print("멍")⇒ Router는 문서전체를 보고 “이건 python이다.”라고 판단하지 않고, 대신 토큰 하나하나를 보는 편
class→ 어떤 Expert?,def→ 어떤 Expert? …이때
self를 보면, 역할이 거의 동일함(”현재 객체 자신”) → 때문에 표현을 변환하는 방식도 비슷⇒ 그래서 Router의 입장에서는 self → 항상 Expert3으로 보내는 것이 학습하기 쉬울 것
반면, dog와 같이 의미가 담긴 토큰이라면, dog과 hotdog는 같은 dog가 들어가더라도 전혀 다른 의미를 가지고 있음 ⇒ 때문에 항상 같은 Expert로 보낼 이유가 없음!!

각 토큰은 자신이 선택된 Expert에 대응하는 배경색으로 표시되어 있음
즉, Router가 실제로 어떤 토큰을 어떤 Expert로 보내는지에 대해 나와있음
python의 self, 영어의 Question 같은 단어가 여러 번 등장하더라도 같은 Expert로 라우팅됨을 보여줌
Quest/ion 처럼 2개 이상의 토큰으로 분리될 수도 있음에도 각 토큰들이 같은 Expert를 선택들여쓰기 토큰들도 항상 같은 Expert에 할당됨
연속된 토큰들도 종종 같은 Expert에 할당됨을 확인할 수 있었음
토큰 하나만 같은 Expert가 아니라 옆에 있는 토큰들까지도 같은 Expert로 가능 경우도 있었음
⇒ Positional Locality
✓ Positional Locality가 뭘까?
결과적으로 옆에 있는 토큰들이 같은 Expert를 선택하는 경우가 많았다는 관찰 결과임
본 논문에서는 왜 이런 현상이 나타났는지에 대해 나와있진 않고, 일반적인 연구자들의 해석은 어떻냐 하면!!
문장이
I am glad to be a BOAZ member.라고 하면, 토큰은IamgladtobeaBOAZ가 됨Attention을 거친 후에는 이 토큰들의 hidden state가 완전히 독립적이지 x
glad는 am도 보고 to 도 보고 be도 봄.
a 도 be 를 보고 있음
⇒ 즉, 연속된 토큰들은 비슷한 문맥을 공유함
⇒ 그래서 **hidden state가 비슷하면** 선택되는 Expert도 비슷해질 가능성이 높아짐
✓ Positional Locality가 모델 성능 관점에 있어서도 괜찮을까?
같은 Expert만 사용하게 된다면 다양성이 떨어지면서 더 낮지 않을까 라는 생각을 했었음
논문에서는 성능이 떨어진다는 증거는 없었음 오히려, 더 좋은 성능을 냄
→ 하지만, Router는 학습됨 즉, 성능이 떨어지면 역전파를 통해 Router의 가중체 도 함께 수정됨
시스템 측면에서는 장단점이 존재함
- 같은 Expert를 계속 사용하면 GPU가 계속 같은 Expert를 실행하면됨
- Expert3 → Expert3 → Expert3 이렇게 되면 메모리나 캐시를 재사용하기 쉬워서 추론이 빨라질 수 있음
- 반면, Expert Parallelism에서는 문제가 될 수 있음
- GPU마다 Expert 하나씩 있다고 할 때, 토큰 1000개가 모두 Expert3로만 가면 GPU3만 엄청 바빠지게 됨