오늘은 2019년에 나온 BERT4Rec 논문 리뷰다
BERT는 2018년 구글이 만들어낸 양방향 트랜스포머이며
Bidirectional Encoder Representations from Transformers라는 풀네임을 가지고있다.
이름에서 볼 수 있듯이 Transformer가 기존에 갖고있던 인코더-디코더 구조가 아닌 인코더만 존재하는 것을 알 수 있다.Transformer와 BERT의 가장 큰 차이점은 학습 방식에 있다 Transformer는 다음 단어를 예측하기위한 학습을 하는
반면,BERT는 마치 빈칸 넣기 문제처럼 MASK된 단어를 학습한다

GPT와 같이 BERT 역시 거대한 말뭉치를 가지고 자연어를 처리하기 위해 학습된 모델이다.
그런데 이 모델을 추천시스템에 적용하기 위해서 나온 논문이 바로 [BERT4Rec]이다. 어떻게 적용했는지 살펴보자
Abstract
당연하게도 유저는 어느 특정한 공간에서 시간의 흐름에 따라 일련의 트랜잭션을 취한다.
한 유저에 대한 트랜잭션을 시계열로 늘어놓으면 우리는 마치 transformer처럼
다음 아이템에 대한 평점을 예측할 수 있을 것이다
| 에어팟 | 아이폰 | 에어팟 케이스 | 영양제 | ... | |
| user1 | 1 | 1 | 1 | 0 | ... |
하지만 저자는 transformer의 단방향적 예측을 지적하며 다음과 같은 두개의 문제를 언급한다
1. 단방향으로 설계된 아키텍처는 유저의 행동의 숨겨진 의도를 제약할 수 있다
2. 또한 순서에 굉장히 얽매여있다
예를 들면,
대부분의 유저가 아이폰을 사고 에어팟을 사는 행동을 보였으나,
일부의 유저들은 에어팟을 사고 아이폰을 사는 행동을 충분히 보일 수 있다.
즉, 유저의 트랜잭션에 일관된 순서를 가정하는 것은 추천시스템에서 비효율적일 수 있다는 것이다
때문에 저자는 왼쪽과 오른쪽으로부터 유저의 트랜잭션을 학습하는 모델을 제안한다
하지만 생각을 해보자
어떤 손님이 다음으로 살 물건을 예측한다고 할 때,
우리는 그 손님의 구매 내역을 조회하여 추측할 순 있지만,
미래에 산 물건을 참고해서 추천을 해주는 불가능하다
BERT는 예측해야할 타겟의 이후 아이템까지 참고하기 때문에
'Data Leakage' 문제를 고려해야한다
Data Leakage : 학습 중 테스트 데이터가 학습되어 온전한 테스트를 하지 못하는 현상
Data Leakage를 막기 위해 저자는 좌와 우에서 진행되는 시퀀스에 대해 동일한 조건을 만들어
Random하게 타겟을 예측할 수 있도록 실험을 설계하였다.
Introduction

전통적인 협업 필터링은 유저와 유저간의 유사도 계산을 통해
타겟 유저에게 '좋아할법한' 아이템을 추천해주곤 하였다.
하지만 현실의 유저들은 더 개인화되었고,
그들의 취향 역시 예측하기 힘들도록 바뀌고있다
때문에 개별 유저의 과거 기록을 기반으로
추천을 해줄 수 있는 RNN 기반의 해결책이 제시되었다
당시 유저의 Sequence를 굉장히 중요히 여겨
GRU, SAS4Rec 등의 단방향 알고리즘이 파생되었다
이전에 언급했던 것처럼, 유저의 다이나믹한 행동에 비해
엄격한 순서를 가정했다는 것이 논문에서 뽑은 핵심적인 문제다
아마 저자는 '순서 이외에 트랜잭션에 영향을 주는
무언가가 있다고 생각한 것 같다'
사실 어렵게 생각할필요 없이
'이쪽말만 듣지말고 저쪽말도 들어보자!'라고 생각할 수 있겠다
Cloze task
cloze task는 마치 빈칸넣기와 같다고 했다.
저자는 Input으로 한 유저의 트랜잭션에 masked token을 넣었다
이 방법의 장점은 좌우의 맥락을 참고할 수 있다는 것,
어디에든 빈칸을 뚫어도 되니 학습 샘플들이 많아진다는 것 등이 있다
BERT4Rec
Problem Statement

기존의 Sequential model가 취했던 방법은
u라는 유저의 시퀀스에서 n+1번째 아이템을 맞추는 것이었다
때문에 다음에 아이템들의 확률을 예측하는 것이 main task이다
Model Architecture
BERTRec은 원래의 BERT 모델이 취하던 아키텍쳐를 상당부분 차용한다
Transformer의 인코더를 가져와 Self-attention을 한다는 것,
그 레이어들을 층으로 쌓아 모든 시퀀스에 대한 정보를 학습하게한다.
BERT4Rec은 CNN에 비해서 더 많은 시퀀스 정보를 흡수할 수 있고,
RNN에 비해서 모델을 병렬화하기 쉽다


CNN기반의 Caser와 비교를 해보면, Caser는 유저의 L(=4)개의 트랜잭션으로 T(=2)개의 트랜잭션을 예측하는 등
단기 의존도가 높아 선호가 Dynamic하게 바뀌는 환경에 더 적합하다고 볼 수 있고,
BERT는 더 넓은 정보를 캡쳐하기 때문에 Caser보다 더 Contextual하다고 볼 수 있다
Transformer Layer
BERT는 L개의 트랜스포머 레어어가 겹쳐진 구조이며 각 토큰(시퀀스)과 레이어마다 Hidden layer를 생성한다
트랜스포머에는 두 개의 서브 레이어들이 있는데, Multi-head self attetion과 Position-wise feed foward nextwork이다
Multi-head self attetion은 말 그대로 self attention의 결과를 여러개 만드는 작업인데 일종의 앙상블이다
개별적으로 나온 각각의 self attention head들을 하나로 concat하여 $W^{O}$라는 가중치 벡터와 곱해준다

왼쪽의 식을 보면 이해가 쉬운데, 각 어텐션 헤드의 특정 시퀀스는
아이템 벡터의 hidden state $H^{l}$에 대한 각 시퀀스 i의
Query, Key, Value의 어텐션 값들이다.
말이 좀 어려운데 원래의 아이템 벡터를 임베딩한 상태과 같은 사이즈의 행렬을 만드는데,
그 행렬은 각 아이템 중 어떤 아이템에 집중할지가 반영된 벡터로 재가공되어서 나오는 것이다.
Attention Mechanism을 쓰는 모델들은 기본적으로 행렬 파라미터를 학습시키는게 주요 태스크이다.
기본적으로 $W^{Q}$, $W^{K}$, $W^{V}$ 모두 학습되어야하는 파라미터이고
Multi head를 다시 원래 시퀀스의 차원으로 변환시키는 $W^{O}$ 역시 학습되어야한다.
Position wise Feed Forward Network
Position wise는 각 아이템의 포지션을 기준으로 FFN을 시행한다는 것이다.
여기서의 Input은 self-attention에서 나온 output인 $h^{l}_{i}$이다.

PFFN($H^{l}$)은 각 포지션마다 계산된 FFN들을
concat하여 transpose한 행렬이다.
FFN은 activation으로 GELU를 사용하였다.
W, b는 모두 학습되는 파라미터이다.
GELU(Gaussian Error Linear Unit)에 대해서 짧게 설명하면,
입력 게이트가 부호를 기준으로 나뉘어지는 RELU는 x가 음수이면 0, 양수이면 1을 사용했다.
GELU는 RELU에 확률 개념을 추가한 활성함수로 dropout과 zoneout의 확률적인 특성을 고려하여
노드를 마스킹하려는 시도라고 보면된다.
GELU를 제안한 Hendrycks and Gimpel는 네트워크가 깊어지는 환경에 적응하며
변형되는 마스크를 만들고 싶었던 것같다.
식은 위처럼 베르누이확률에 input x를 한번 더 곱해준 형태인데
x의 값이 낮아질수록 0이 될 확률이 높아지게 만들었다
Source: GAUSSIAN ERROR LINEAR UNITS (GELUS) (2020)
Stacking Transformer Layer
앞서 소개했던 sublayer들로 구성된 하나의 Transformer Layer를 여러겹 쌓아보자.
레이어를 쌓음으로 유저의 복잡한 행동을 깊게 학습할 수 있을 것이다.


하지만 깊이가 깊어지면 자연스럽게 Gradient Vanishing이
생기게되는데 input을 residual connection으로 연결해주었다.
특히 인코더 아키텍처에 [Add & Norm]이 있는데, 아래와 같이 수행된다.
LayerNormalization(x + Dropout(sublayer(x))
처음의 x는 residual connection을, sublayer를 Dropout시킨
hidden state들을 레이어정규화를 한다.
결과적으로 위 사진의 수식이 해당 모델에서 제안하는 트랜스포머의 레이어이자 요약이 되겠다.
l-1번째 Multi-Head Attention들이 Dropout과 residual connection을 통해 $A^{l-1}$이 되고
같은 방법으로 PFFN을 거쳐 $H^{l-1}$의 트랜스포머 레이어를 만든다
너무 힘들어서 두개로 나눠서 적어야겠다
전반부 끝!
참고
[1] https://hongl.tistory.com/236
[2] https://heekangpark.github.io/nlp/attention
[3] https://arxiv.org/abs/1706.03762
[4] https://arxiv.org/abs/1904.06690