---
title: "The Forward-Forward Algorithm 정리"
description: "Forward-Forward 알고리즘은 레이블이 있는 positive와 negative 샘플을 두 번의 순전파만으로 가중치를 업데이트하며, 각 층이 자체적인 goodness를 최적화하도록 설계된다. 이를 통해 레이어별 독립적인 학습, 정규화 기법, RNN 형태의 상하층 상호작용 등 다양한 변형과 실험을 수행했으며, MNIST와 CIFAR‑10에서 역전파 대비 약간 낮은 정확도이지만 비슷한 성능을 보이고, 학습 속도와 수렴 면에서 차이가 있음을 확인했다."
date: "2025-09-26T16:41:00.000+09:00"
last_modified: "2026-05-15T08:36:00.000Z"
type: "Paper"
tags:
  - "deep learning"
  - "paper"
categories:
  - "📄 Research Paper"
series:
  - "AI 논문 리뷰"
canonical_url: "https://blog.pieroot.xyz/forward-forward-algorithm"
markdown_url: "https://blog.pieroot.xyz/forward-forward-algorithm.md"
---

# The Forward-Forward Algorithm 정리

Forward-Forward 알고리즘은 레이블이 있는 positive와 negative 샘플을 두 번의 순전파만으로 가중치를 업데이트하며, 각 층이 자체적인 goodness를 최적화하도록 설계된다. 이를 통해 레이어별 독립적인 학습, 정규화 기법, RNN 형태의 상하층 상호작용 등 다양한 변형과 실험을 수행했으며, MNIST와 CIFAR‑10에서 역전파 대비 약간 낮은 정확도이지만 비슷한 성능을 보이고, 학습 속도와 수렴 면에서 차이가 있음을 확인했다.

> 한줄 요약
> 
> 
> label 을 true, false 만 두어 분류 모델을 지도 학습 한다.

## **1. What is wrong with backpropagation**

최근 10년동안 딥러닝은 많은 매개변수와 데이터를 사용하여 확률적 경사하강법을 수행하는것으로 효율성을 입증했다.

경사하강법은 일반적으로 역전파(backpropagation) 을 사용하는데 이 방법을 뇌가 사용하는지, 사용하지 않는다면 어떤 다른 방법을 사용하는지는 아직 모른다.

대뇌 피질이 어떻게 학습하고 뉴런이 연결되는 방법을 발명하기 위해 많은 시도가 있었지만 아직까지는 밝혀지지 않고 실현가능성이 적어보인다.

- 뇌피질(coretex)는 error derivatives 를 실제로 거꾸로 전달하고 이전 activate function 들을 저장해서 사용한다는 증거가 없음

- 시각 신경계에서는 상향식 연결과 하향식 연결이 존재하는데 대칭적이지 않음

특히 감각을 즉각적으로 처리하기 위해서는 여러 step 을 통한 역전파를 거쳐 학습을 하는것은 실현 가능성이 낮음

## 2. The Forward-Forward Algorithm

positive, negative 샘플을 이용하여 두번의 forward pass 를 이용하여 가중치를 갱신하는 방법을 설명

기존의 역전파처럼 하나의 loss 를 미분하여 학습하는 방법 대신, 각 레이어가 자기 ***goodness***(적합도) 를 높이거나 낮추는 국소적인 목표를 가짐

실제 데이터(정답)를 실행하는 postive pass 에서는 각 레이어가 ***goodness*** 를 높이고, 오답 데이터를 실행하는 negative pass는 goodness 를 낮춘다.

**Goodness 계산 수식:**

$$
p(\text{positive}) = \sigma\left(\sum_j y_j^2 - \theta\right)
$$

여기서:

- $j$는 레이어에 존재하는 하나의 은닉 유닛

- $y_j$는 레이어 정규화 이전의 은닉 유닛 j의 활성도 ← $y_j = f(Wx_j+B)$

- $σ$는 로지스틱 함수(시그모이드 함수)

- $θ$는 임계값(threshold)

- $\sum_j y_j²$는 모든 은닉 유닛의 활성도 제곱의 합으로 goodness를 나타냄

각 레이어에서만 연산을 하면 되기에 파이프라인구조를 형성하여 독립적으로 연산 처리가 가능 → 모든 레이어가 다른 프로세스(서버)에 있어도 연산 가능

### 2.1 Learning multiple layers of representation with a simple layer-wise goodness function

각 층이 따로따로 학습이 되어야하는데 $\sum_j y_j²$ 이 크기로만 긍정과 부정을 나누어 레이어를 학습한다면 첫번째 층에서 나타난 특징을 다른 모든 층이 그대로 학습을 해버려 쓸모가 없어진다.

두번째 층 이상부터 쉽게 학습을 하는걸 방지하기 위해 정규화를 진행하여 다음층에 보내야한다.

아래와 유사한 방식으로 크기 정보를 제거한 벡터를 남겨 전달한다.

> 정규화 수식은 논문에 포함되어있지 않습니다

#### **레이어 정규화(Layer Normalization) 수식:**

$$
\mu = \frac{1}{m}\sum_{j=1}^{m} y_j
\qquad
\sigma = \sqrt{\frac{1}{m}\sum_{j=1}^{m}(y_j - \mu)^2 + \varepsilon}
$$

$$
\text{LayerNorm}(y)_j = \gamma \cdot \frac{y_j - \mu}{\sigma} + \beta
$$

여기서:

- $\mu$는 레이어의 평균

- $\sigma$는 레이어의 표준편차

- $\gamma$는 학습 가능한 스케일 파라미터

- $\beta$는 학습 가능한 시프트 파라미터

- $\varepsilon$는 0으로 나누는 것을 방지하기 위한 작은 상수

- $\cdot$는 요소별 곱셈(element-wise multiplication)

레이어 정규화는 각 샘플의 모든 은닉 유닛에 대해 평균과 분산을 계산하여 정규화를 수행합니다. 이는 배치 정규화와 달리 배치 크기에 독립적이며, RNN이나 작은 배치 크기에서도 효과적으로 작동합니다.

#### **RMS 정규화 수식:**

$$
\text{RMSNorm}(y)_j = \frac{y}{\sqrt{\text{mean}(y^2) + \varepsilon}}
$$

여기서:

- $y$는 정규화 이전의 은닉 유닛 활성도

- $y_{\text{norm}}$는 정규화된 은닉 유닛 활성도

- $\text{mean}(y^2)$는 활성도 제곱의 평균

- $\varepsilon$는 0으로 나누는 것을 방지하기 위한 작은 상수

이를 통해 각 레이어가 서로 다른 특징을 학습할 수 있도록 한다.

논문에서 어떤 알고리즘을 사용한다고 힌트는 알려주었지만

크기가 제거된 상태로 방향 값만 남겨 전달되기에 층이 깊어질수록 특징 표현이 계속 발전된다.

## 3. Some experiments with FF

### 3.1 The backpropagation baseline

실험 방법은 아래와 같다.

- Dataset : MNIST 손글씨
  - Train : 50,000
  - Validation :10,000
  - Test : 10,000

소형 CNN 모델은 보통 0.6% error 를

Permutation‑Invariant 설정에서는 ReLU기반의 Feed-Forward 네트워크에서 1.4% error 를 가진다.

위 두가지 모델과 비교하며 2% 이하의 오류를 가지는 것을 목표로 한다.

### 3.1 A simple unsupervised example of FF

![image](https://blog.pieroot.xyz/api/image-proxy?id=890470fe-bb50-4322-98d2-db52e89b2fa3&kind=s3&pageId=27a067c0-15d0-80af-ad5b-d02c5b768cb0&source=block&blockId=28f067c0-15d0-80de-94e9-daf7399caf08)

논문에서 2가지 질문이 있다

1. 좋은 negative 데이터가 있다면(누가 봐도 오답인) 여러 레이어는 효과적인 학습이 가능한가?

1. 그런 좋은 데이터는 어디에서 얻을 수 있는가?

우선 실험을 위해 negative 데이터를 아래와 같이 만들었다.

1. 원본 값(7을 나타내는 이미지)에 랜덤으로 만들어진 마스크를 곱한다.

1. 다른 값(6을 나타내는 이미지)에 만들어진 마스크의 역을 곱한다.

1. 만들어진 두개의 이미지를 더하여 negative 데이터를 생성

실험은 2000개의 ReLU를 활성화 함수로하는 유닛을 4개의 층으로 만들고 마지막 3개 층의 출력 결과를 concatenation 하여 소프트맥스 분류기를 학습했다.

```javascript
layer 1 -> FF 2000 ReLU
layer 2 -> FF 2000 ReLU => Y_1
layer 3 -> FF 2000 ReLU => Y_2
layer 4 -> FF 2000 ReLU => Y_3
layer 5 -> Concat(Y_1, Y_2, Y_3) => SoftMax input
```

또한 죽은 ReLU 문제를 해결하기 위해 ReLU 의 변형(0의 가중치를 일정 수치만큼 올림)을 사용

결과는 100 epochs 후에 1.37% 의 오류율을 보여주었다.

> #### ***왜 이런 결과를 얻을 수 있었는가?***
> 
> 논문에서는 비지도 학습이라 칭하지만 **positive**, **negative** 데이터를 흘려주기만 해도 학습이 된다는게 이해가 되지 않았다.
> 
> 설명에서는 빠졌지만 순전파를 흘려 학습할때 각 레이어에 현재 데이터가 “정답 vs 오답” 여부는 알려준다.
> 
> 이를 토대로 정답과 오답에 맞는 **goodness** 가 나왔는지, 실수를 했다면 보정(학습)을 수행한다.

### 3.3 A simple supervised example of FF \*\*

단일 태스크를 위한 학습에서는 굳이 비지도 학습을 하지 않고 지도학습을 하는게 더 효율적이다.

FF 에서는 지도학습을 하기위한 예시로 입력에 레이블을 포함시키는 방법을 소개한다.

긍정 데이터에는 “이미지 + 정답 레이블”

부정 데이터에는 “이미지 + 오답 레이블”

앞선 테스트와 동일하게 수행하면서 지도학습을 진행한다.

동일하게 2000 ReLU 유닛 X 4개 레이어를 FF 로 60 epochs 를 학습하면 1.36% 의 오류율이 발생한다.

→ 이는 역전파로 20 epochs 만에 도달한 수치다

학습을 빠르게 하기 위해 학습률을 2배 높여 40 epochs 을 수행하면 성능이 오히려 떨어져 1.46% 가 되었다

추론은 두 방식이 있습니다.

> 빠른 1패스 방식: 테스트 이미지와 중립 레이블(각 0.1)로 한 번 전진하고, 첫 히든층을 제외한 히든 활동을 학습된 소프트맥스에 넣어 분류합니다. 빠르지만 최적은 아닙니다.

> 더 나은 방식: 각 후보 레이블을 입력에 포함해 네트를 돌리고, 첫 히든층을 제외한 모든 층의 goodness를 누적합니다. 레이블마다 수행해 누적 goodness가 가장 큰 레이블을 선택합니다. 학습 중에는 중립 레이블로 한 번 돌려 “어려운 부정 레이블”을 고르는 트릭을 써서 필요한 에폭을 약 3분의 1로 줄였습니다.

뭐 쉽게 요약하면 최적화를 하기 위해 goodness 를 누적하여 선택 학습하거나 데이터를 증강해서 학습 효율을 높여보겠다 이거다.

```
데이터 증강으로 이미지를 상하좌우 최대 2픽셀까지 지터링해 25가지 이동을 추가하면(이 경우 픽셀 공간 정보를 활용하므로 더 이상 permutation‑invariant가 아님), 같은 네트를 500에폭 학습했을 때 테스트 오류가 0.64%로, 역전파로 학습한 소규모 CNN과 비슷해집니다. 이 설정에선 첫 히든층의 흥미로운 수용장이 관찰됩니다.
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=3e1f6890-f275-4252-912b-7e99f090341a&kind=s3&pageId=27a067c0-15d0-80af-ad5b-d02c5b768cb0&source=block&blockId=28f067c0-15d0-80d4-8519-c78464dbf22f)

이미지를 이동하며 학습을 해보니 첫번째 레이어의 수용장에 있는 첫 10개 블럭이 라벨이 된것처럼 보인다.

### **3.4 Using FF to model top-down effects in perception**

![image](https://blog.pieroot.xyz/api/image-proxy?id=a5bf7ed5-4b3e-4ff3-bc82-ade7fe3067c5&kind=s3&pageId=27a067c0-15d0-80af-ad5b-d02c5b768cb0&source=block&blockId=28f067c0-15d0-80c6-ade6-ee23ae861c8a)

FF 는 각 레이어에서 greedy 학습되는 알고리즘이라서 뒤쪽에 있는 다른 층이 앞층의 학습에 영향을 주지 못한다. ~~(당연히 역전파가 아니니까)~~

이를 극복(?) 하기 위해서 RNN 구조 학습하는 방법을 소개한다.

그림이 뭔소린지 모르겠는데 논문을 다소 많은 의역을 해보면

```
검증을 위해, 동일한 MNIST 이미지를 매 프레임에 반복해 넣는 “비디오” 입력을 사용합니다. 
맨 아래 층은 픽셀 이미지, 맨 위 층은 원‑핫 레이블입니다. 
중간에 2~3개의 2000 뉴런 층을 둡니다. 

예비 실험에선 10 타임스텝 동안, 짝수 층을 홀수 층의 정규화된 활동으로 갱신하고 이어서 홀수 층을 새 짝수 층 활동으로 갱신하는 교대 업데이트를 시도했는데, 약간의 감쇠(damping)를 주고 모든 히든층을 이전 시점 정규화 상태로 동기 업데이트하는 편이 오히려 학습이 약간 더 잘 되었습니다. 
본 실험은 동기 업데이트를 채택하며, 새 “정규화 전” 상태를 이전 상태의 0.3과 새로 계산한 상태의 0.7을 섞어 설정합니다.
```

이걸 다시한번 정리하면

1. 동일한 이미지를 매우 지루한(아주 찔끔 변할 수도 있고 아닐 수도 있고~) 동영상으로 간주하고 시계열로 데이터를 입력

1. 각 레이어를 통과하며 순차적인 학습을 진행

1. 다음 레이어의 **goodness** 수치를 이전 레이어의 다음 데이터를 처리할 때 이전 레이어에 **goodness** 정보를 전달

1. 현재 레이어의 가중치 변화량과 다음 레이어의 가중치 변화량을 융합하여 파라미터를 조정

### **3.5 Using predictions from the spatial context as a teacher**

RNN 형태의 FF 에서는 위(앞)층과 아래(뒤)층 입력이 같은 긍정일때 goodness 를 보다 더 크게 활성화

두 레이어가 서로 다른 결과를 반환할때에는 파라미터가 잘못 학습되는걸 줄여줌

> ⇒ 둘이 의견이 같다면 좋게 학습
> ⇒ 둘이 의견이 다르면 잘못된 학습으로 상쇄
> ⇒ 둘다 틀리게 판단하면 보다 맞는 방향으로 학습

## 4. **Experiments with CIFAR-10**

CIFAR-10(32x32) 에서 FF 를 평가

- training dataset : 50,000

- test dataset : 10,000

FF 가 비 합성곱(conv)네트워크를 사용하기에 BP 도 conv 가 없는 MLP로 구성

FF 는 레이어별로 가중치 공유가 불가능하게 설계되어있으므로 hidden unit 의 갯수 제한 없이 성능의 이점이 있다는걸 나타내기 위해 비슷한 사이즈의 BP 와 비교했다

결과론적으로는 BP 보다는 다소 성능이 떨어지지만 FF 도 BP 못지 않게 성능이 꽤 유사하다

하지만 BP 는 FF 대비 압도적인 속도의 수렴 속도를 보여준다

## 5. Sleep

뇌에 투영하면 사람이 깨어있을때에는 postive 데이터를 학습하고, 잠에 들었을때에는 negative 데이터를 생성하여 처리하면 언제든 학습이 가능하여 모델 학습에 이점이 있을것이라 생각하고 제안했다.

초기 제안 방법에서는 양성 데이터로 미리 여러번 학습을 하고, 네트워크가 직접 생성한 음성 데이터로 여러번 업데이트를 해도 성능의 손실이 거의 없을것이라 예상하고 결과가 나왔다.

하지만 나중에 재현에 실패했고 버그가 발생할 가능성이 높은것으로 보인다.

현재는 postive 와 negative 데이터를 분리해서 따로 학습하면 안정적으로 학습하지 않는 문제가 있다.

즉, 연속적으로 RNN 구조의 형태로 학습을 하면 효율이 그럭저럭 쓸만은 하지만, postive 와 negative 를 나누어 학습하는것은 증명되지 않았기에 추가 연구가 필요해 보인다.

만약 postive, negative 데이터를 분리학습이 가능하다면 negative 학습을 제거했을 때를 무수면 상태로 보고 수면 부족의 악영향을 모사하는지 연구하는것도 재밌어 보인다.
