희소 코딩: 축은 많이, 쓰는 축은 몇 개만

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
「번호 + 거리」와 「동쪽 + 북쪽」을 같은 숫자 둘로 봄 1 번호는 몇 가지 가운데 하나라 log₂(가짓수) 비트면 된다. 실수 하나에 번호가 붙은 것과 실수 둘은 다르다
축이 차원보다 많은데 답이 하나라고 봄 2 미지수가 식보다 많으면 답이 끝없이 많다. 어느 답을 고를지는 기준이 정한다
제곱합이 가장 작은 답(유사역행렬)이 희소하다고 봄 2 제곱합은 값을 여러 축에 나눠 주는 답을 좋아한다. 0이 적은 답은 다른 기준이 고른다
차원보다 많은 특징을 담으면 늘 서로 망가뜨린다고 봄 3 특징이 드물게 켜지면 거의 늘 하나만 켜진다. 켜질 확률 0.05면 켜진 경우의 5.1%만 겹친다
소프트 스레숄딩과 하드 스레숄딩을 같게 봄 4 소프트 스레숄딩은 문턱을 넘은 만큼만 남겨 값이 뛰지 않는다. L1 페널티의 답은 소프트 스레숄딩이다
계수가 모두 0이 되는 λ를 신호의 크기로 어림함 5 0에서의 그래디언트가 꺾인 폭 안에 들어야 한다. λ ≥ max |aⱼ·x|
처음 내적이 큰 축이 먼저 살아난다고 봄 5 앞서 살아난 축이 신호를 가져간 뒤의 내적이 정한다
작은 가중치는 학습 뒤 반올림하면 된다고 봄 6 반올림 문턱은 목적 밖의 임의 선택이다. L1 페널티는 목적 안에서 0을 고른다
스텝 크기를 「차이 × 1」로 노이즈 7 차이가 (1 − 곡률 × 스텝 크기)배가 된다. 곡률이 클수록 스텝을 줄인다
보장 범위를 넘은 스텝 크기가 한 번 통하면 늘 통한다고 봄 8 η ≤ 1/σ₁² 가 모든 문제의 보장이다. 넘으면 쓰이는 축에 따라 수렴, 진동, 발산이 갈린다
음수를 막은 ISTA 와 부호 있는 ISTA 가 같은 답을 낸다고 봄 9 답에 음수 계수가 필요한 신호에서는 다른 답이 나온다
축의 길이를 묶지 않고 L1 페널티를 줌 11 축을 늘리고 계수를 줄이면 페널티가 0으로 간다. 축을 길이 1로 묶는다
축 수를 늘리면 일하는 축도 그만큼 는다고 봄 12 죽은 축이 생기거나 한 특징을 여럿이 쪼개 맡는다

요약

이 장에서 한 일을 정리해 보자. 자료가 평평한 면 하나가 아니라 여러 직선(부분공간)의 합집합에 놓이면, 주성분 축은 그 구조를 보지 못한다. 별 모양 점 300개에서 두 고윳값은 0.184와 0.174로 거의 같았다. 차원보다 많은 축을 모아 두고 점마다 몇 개만 쓰는 희소 코드로 적으면, 점마다 계수 하나와 축 번호(log₂ 3 비트)로 충분해 300점이 4,800비트에서 약 2,900비트로 줄었다. 축이 넘치면 같은 점을 적는 방법이 끝없이 많고, 제곱합이 가장 작은 답은 축을 모두 쓴다.

0이 아닌 계수의 수를 직접 줄이는 대신 절댓값 합을 페널티로 주면(L1 페널티, 라쏘), 계수 하나의 답은 작은 값을 0으로 만드는 소프트 스레숄딩이 되고, 계수가 여럿이면 등고선이 마름모의 꼭짓점에 닿아 계수가 0이 된다. 계수가 서로 겹칠 때는 맞추기 항으로 경사 한 스텝, 페널티로 소프트 스레숄딩 한 번을 되풀이하는 ISTA로 푼다. 네 칸 신호에서 칸2~칸4의 계수는 넷째 스텝에 0이 되었고, 스텝 크기 η ≤ 1/σ₁²에서 목적은 스텝마다 준다. 축 자체도 코드 고치기와 축 고치기를 번갈아 하는 딕셔너리 러닝으로 자료에서 찾을 수 있다. 별 모양에서는 두 번 만에 세 직선을 찾았지만, 목적이 볼록하지 않아 처음 축에 따라 갇히기도 했다. 언어 모델 안에서 딕셔너리 러닝을 희소 오토인코더로 한 연구들은, 뉴런 수보다 훨씬 많은 축을 배우고 토큰마다 그 가운데 몇백 개만 켜지는 코드를 얻었다.

flowchart LR
  A["자료가 직선 여러 개 위<br/>(부분공간의 합집합)"] --> B["넘치는 딕셔너리<br/>점마다 몇 개만: 희소 코드"]
  B --> C["L1 페널티<br/>소프트 스레숄딩이 0을 만든다"]
  C --> D["ISTA<br/>경사 한 스텝 + 문턱 한 번"]
  D --> E["딕셔너리 러닝<br/>코드와 축을 번갈아"]
  E --> F["희소 오토인코더<br/>언어 모델 속 특징"]

막힌 곳

이 장의 코드는 모두 자료를 거의 그대로 되살리려 했다. 별 모양은 오차 0으로 적었고, 라쏘의 페널티 세기 λ도 되살린 것이 조금 달라지는 것을 「계수를 줄이는 값」으로 참았을 뿐, 되살린 것과 원래 신호의 차이를 얼마나 허락할지 처음부터 정하지는 않았다. 그런데 사진이나 소리처럼 받는 사람이 조금 다르게 되살려도 상관없는 자료가 많다. 되살린 것이 원래와 평균 얼마까지 달라도 된다고 정해 두면, 점 하나를 적는 데 꼭 필요한 비트는 몇 비트일까? 그리고 차이를 허락할 때, 자료의 어느 성분을 먼저 버려야 할까?