1. GPT-1 (2018)
  • 기술적 특징
    • 파라미터: 1.17억개
    • 데이터: BookCorpus (7,000권의 미출판 도서)
    • 트레이닝 방식:
      • 비지도 사전학습 + 지도학습 미세조정
      • 다음 단어 예측 작업으로 학습
    • 아키텍처:
      • 12-layer 디코더 전용 트랜스포머
      • 768 차원의 임베딩
      • 12개의 어텐션 헤드
  • 주요 혁신
    • 트랜스포머 기반 언어 모델 상용화
    • 전이 학습의 효과적인 활용
    • 제한적이지만 문맥 이해 능력 입증
  • 참고문헌: Radford, A., et al. (2018). "Improving Language Understanding by Generative Pre-Training"
2. GPT-2 (2019)
  • 기술적 특징
    • 파라미터: 15억개 (최대 버전)
    • 데이터: WebText (40GB의 고품질 인터넷 텍스트)
    • 학습 방식:
      • 제로샷 태스크 학습에 초점
      • 더 긴 컨텍스트 처리 가능
    • 아키텍처:
      • 48-layer 트랜스포머
      • 1,600 차원의 임베딩
      • 25개의 어텐션 헤드
  • 주요 발전
    • 제로샷 학습 능력 입증
    • 고품질 텍스트 생성
    • 다양한 태스크 수행 능력
    • 컨텍스트 이해도 향상
  • 윤리적 고려사항으로 인한 단계적 공개
    • 초기: 117M 파라미터 모델
    • 중기: 355M 모델
    • 후기: 774M 모델
    • 최종: 1.5B 모델
  • 참고문헌: Radford, A., et al. (2019). "Language Models are Unsupervised Multitask Learners"
3. GPT-3 (2020)
  • 기술적 특징
    • 파라미터: 1,750억개
    • 데이터:
      • Common Crawl
      • WebText2
      • Books1&2
      • Wikipedia
    • 학습 방식:
      • 퓨샷 학습 능력 강화
      • 더 큰 컨텍스트 윈도우
    • 아키텍처:
      • 96-layer 트랜스포머
      • 12,288 차원의 임베딩
      • 96개의 어텐션 헤드
  • 핵심 혁신
    • 규모의 효과 입증
      • 모델 크기 증가에 따른 성능 향상
      • 새로운 능력의 자연스러운 출현
    • 퓨샷 학습 능력
      • 적은 예시로 새로운 태스크 수행
      • 문맥 학습의 효율성
    • 다양한 응용 가능성
      • 코드 생성
      • 번역
      • 질문-답변
      • 요약
  • 한계점
    • 계산 비용
    • 환경적 영향
    • 편향성 문제
    • 사실 정확성
  • 참고문헌: Brown, T., et al. (2020). "Language Models are Few-Shot Learners"
4. GPT-4 (2023)
  • 기술적 특징
    • 멀티모달 능력:
      • 이미지 이해 및 분석
      • 다양한 형식의 입력 처리
    • 향상된 추론 능력:
      • 복잡한 문제 해결
      • 논리적 사고 체인
    • 안전성 강화:
      • 편향성 감소
      • 유해 콘텐츠 필터링
  • 주요 발전
    • 전문 분야 성능
      • 법률
      • 의학
      • 프로그래밍
      • 학문적 분석
    • 시스템 통합
      • API 기반 서비스
      • 플러그인 시스템
      • 타 서비스와의 연동
    • 안전성 및 제어
      • 스팸 방지
      • 오용 방지
      • 윤리적 가이드라인
  • 참고문헌: OpenAI. (2023). "GPT-4 Technical Report"

'2. Machine, Deep Learning > Language' 카테고리의 다른 글

[LLM] BERT 정리  (0) 2025.01.07
[NLP] 언어 모델의 역사  (0) 2025.01.07
BERT와 양방향 모델 (2018-2019)
  • BERT (Bidirectional Encoder Representations from Transformers)
    • Google AI가 개발, 2018년 10월 공개
    • MLM(Masked Language Modeling) 및 NSP(Next Sentence Prediction) 도입
    • GLUE 벤치마크에서 획기적인 성능 달성
    • 참고: Devlin, J., et al. (2018). "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"
주요 BERT 변형 모델들
  1. RoBERTa (2019, Facebook AI)
    • 더 큰 배치 크기와 더 긴 학습 시간
    • 동적 마스킹 도입
    • NSP 제거로 성능 개선
    • 참고: Liu, Y., et al. (2019). "RoBERTa: A Robustly Optimized BERT Pretraining Approach"
  2. ALBERT (2019, Google Research)
    • 파라미터 공유로 모델 크기 감소
    • 문장 순서 예측 태스크 도입
    • 참고: Lan, Z., et al. (2019). "ALBERT: A Lite BERT for Self-supervised Learning of Language Representations"

'2. Machine, Deep Learning > Language' 카테고리의 다른 글

[LLM] GPT 정리  (2) 2025.01.08
[NLP] 언어 모델의 역사  (0) 2025.01.07

 

1. 초기 통계적 접근 (1960-1970년대)

  • 통계적 언어 모델의 탄생
    • 1948년 Claude Shannon이 "A Mathematical Theory of Communication"에서 정보 이론 소개
    • 1960년대 IBM의 Frederick Jelinek가 음성 인식을 위한 n-gram 모델 개발
    • 주요 논문: Shannon, C. E. (1948). "A Mathematical Theory of Communication." Bell System Technical Journal.
  • 초기 구현의 한계
    • 하드웨어 제약: 당시 컴퓨터는 수백 KB의 메모리만 보유
    • 데이터 부족: 디지털화된 텍스트 코퍼스 부재
    • 계산 복잡성: n이 증가할수록 n-gram 모델의 복잡도가 기하급수적 증가

2. 신경망 시대의 시작 (1980-1990년대)

  • 초기 신경망 모델
    • 1986년 Rumelhart, Hinton, Williams가 역전파 알고리즘 제안
    • 1989년 Elman이 순환 신경망(RNN) 소개
    • 주요 논문: Rumelhart, D. E., et al. (1986). "Learning representations by back-propagating errors." Nature.
  • 주요 혁신
    • 단어 표현의 분산 표현 개념 도입
    • 문맥 기반 언어 처리의 기초 확립
    • LSTM (1997년, Hochreiter & Schmidhuber) 개발
    • 참고 문헌: Hochreiter, S., & Schmidhuber, J. (1997). "Long Short-Term Memory." Neural Computation.

3. 현대적 접근의 시작 (2000년대 초-중반)

  • 신경망 언어 모델의 발전
    • 2003년 Bengio의 신경망 언어 모델 제안
    • 확률적 문맥 표현 도입
    • 주요 논문: Bengio, Y., et al. (2003). "A Neural Probabilistic Language Model." JMLR.
  • 단어 임베딩의 혁신
    • 2013년 Word2Vec (Mikolov et al.)
    • 2014년 GloVe (Pennington et al.)
    • 참고: Mikolov, T., et al. (2013). "Efficient Estimation of Word Representations in Vector Space." arXiv.

4. 트랜스포머 혁명 (2017-현재)

  • 트랜스포머 아키텍처
    • 2017년 "Attention is All You Need" 논문 발표
    • 어텐션 메커니즘의 혁신적 도입
    • 주요 논문: Vaswani, A., et al. (2017). "Attention is All You Need." NeurIPS.

5. BERT와 양방향 모델 (2018-2019)

  • BERT (2018): 양방향 인코딩 도입 [LLM] BERT 정리
  • GPT-1 (2018): 생성적 사전 학습 도입 [LLM] GPT 정리
  • GPT-2 (2019): 제로샷 학습 능력 입증 
  • GPT-3 (2020): 1,750억 매개변수 규모
  • 참고: Devlin, J., et al. (2019). "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding." NAACL.

6. 최신 발전 (2022-2024)

  • 멀티모달 모델
    • DALL-E, Stable Diffusion: 텍스트-이미지 생성
    • GPT-4: 다중 양식 입력 처리
    • 참고: OpenAI. (2023). "GPT-4 Technical Report." arXiv.
  • 특화 모델
    • Github Copilot: 코드 생성 특화
    • ChatGPT: 대화형 인터페이스 최적화
    • Claude: 윤리적 고려사항 강화

'2. Machine, Deep Learning > Language' 카테고리의 다른 글

[LLM] GPT 정리  (2) 2025.01.08
[LLM] BERT 정리  (0) 2025.01.07

이번 글을 딥러닝 분류 모델을 작성하던중 라벨 불균형 문제를 해결하기 위해 알게 된 Focal Loss에 대해 정리한 글입니다.

TL;DR

  • Focal Loss 는 2018년 Focal Loss for Dense Object Detection에서 제안된 손실함수로 분류 테스크에서 데이터 불균형을 해결하기 위해 제안되었습니다.
  • 데이터 불균형과 관련해서는 아래의 연구에서 데이터 비율이 10배를 넘어가면 분류 성능이 저하된다는 것을 실험적으로 증명하였습니다.

The Effect of Class Distribution on Classifier Learning:An Empirical Study

  • 이진 분류 문제에서 일반적으로 사용하는 Cross Entropy Loss는 잘못 예측된 데이터에 대해 큰 패널티를 주는게 목적인 함수입니다.
  • 일반적인 Cross Entropy는 데이터 불균형을 해결할 수 없었고, 이를 해결하기 위해 데이터의 개수에 따라 가중치를 주는 Balanced Cross Entropy Loss이 제안되었습니다.
  • 하지만 단순히 개수만으로 데이터 분류의 쉽고 어려움을 판단하기에는 무리가 있었고, 이를 해결하기 위해 제안된 것이 Focal Loss 입니다.
  • Focal Loss는 모델이 쉽게 분류할 수 있는 다수(majority, easy negative)에 대해 loss를 더 많이 낮춤으로서 다수 데이터의 영향이 누적되는 현상을 막고자 했습니다.

Focal Loss

  • 구체적인 수식에 대한 설명은 자세하게 설명된 글이 많기 때문에 생략하겠습니다.
  • 아래는 Cross Entropy Loss 와 Focal Loss 의 식입니다.

$$
CE = -log(p) \
FL = -(1-p)^{\gamma}log(p)
$$

  • 위 식을 그래프로 그린다면 아래와 같습니다.

  • 즉, $\gamma$ 파라미터를 조정하여 이미 학습이 잘되는(well-classified) 다수의 데이터에 대해서는 loss를 더 빠르게 낮춤으로서 누적되는 영향을 줄이는 것입니다.

Pytorch Implement

  • Pytorch 에서는 torchvision.ops.sigmoid_focal_loss 함수로 Focal Loss를 사용할 수 있습니다.

  • 소스 코드를 확인해보니 함수안에 sigmoid 함수가 포함되어 있기 때문에 입력값은 확률값이 아니라 모델 출력을 그대로 넣어주어야 합니다.

  • Explicit regularization techniques are those specifically and solely designed to constrain the effective capacity of a given model in order to reduce overfitting. Furthermore, explicit regularizers are not a structural or essential part of the network architecture, the data or the learning algorithm and can typically be added or removed easily.
    • weight decay
    • dropout
    • stochastic depth
  • Implicit regularization is the reduction of the generalization error or overfitting provided by characteristics of the network architecture, the training data or the learning algorithm, which are not specifically designed to constrain the effective capacity of the given model.
    • stochastic gradient descent (SGD)
    • batch normalization

참고 논문

https://openreview.net/pdf?id=ByJWeR1AW 

 

'2. Machine, Deep Learning' 카테고리의 다른 글

베이지안 최적화  (0) 2022.10.20

소개

베이지안 최적화는 하이퍼파라미터를 찾아낼 수 있는 기법 중에 하나로 지금까지도 그 효능은 많은 인정을 받고 있는 기법이다.
베이지안 최적화는 기본적으로 베이지안 원리를 따르며 아래의 식을 만족하는 최적의 지점을 찾아내는 문제라고 볼 수 있다.

$$
x^{*} = argmax_{x \in \mathbf{X}} f(x)
$$

베이지안 기법

일어나지 않은 일에 대한 확률을 불확실성(uncertainty)의 개념. 즉, 사건과 관련 있는 여러 확률을 이용해 새롭게 일어날 사건을 추정하는 것이 베이지안 확률이다.frequentist probability 와 약간 차이가 있는데 베이지안 기법은 우리가 이미 알고 있는 믿음을 바탕으로 어떤 데이터가 주어졌을때 사후확률을 수정하는 과정이라고 볼 수 있다. 말로 표현하는게 더 어려운 개념인데 수식을 보면 아래와 같다.

$$
P(A|B) = {P(B|A)P(A)\over{P(B)}}
$$

왼쪽 항이 Posterior Probability(사후확률) / 오른쪽 항은 likelihood(우도확률)과 prior(사전확률) 이다. 사실 실생활에서 우리가 계산하고자 하는 것은 사후확률이다. 즉 사건이 모두 발생한 후 우리가 관측한 데이터를 바탕으로 모델의 확률을 계산하는 것이다. 하지만 실제로 사후확률을 계산하는 것이 어려운 경우가 많다. 하지만 우도함수, 사전확률 등은 비교적 접근이 쉽기 때문에 이를 사용해서 우회적으로 사후확률을 계산하는 것이다.

예시

Q. 3개의 생산라인을 갖고 있는 공장에서 1번 라인에서 전체 생산품의 30%, 2번 라인에서 50%, 3번 라인에서 20%가 만들어진다. 각 라인에서 나오는 불량품은 2%, 6%, 1%라고 한다. 이 회사제품 중 임의로 하나를 추출한 제품이 불량일 때, 이 제품이 2번 라인에서 생산되었을 확률은?
  • 우리가 구하고자 하는 것은 P(2번 | 불량) 이라고 볼 수 있다. 베이지안 공식을 사용해서 이 확률을 계산하면

$$
\begin{align}
P(2번 | 불량) &= {P(불량 | 2번)P(2번) \over{P(불량)}} \\
&= {P(불량 | 2번)P(2번) \over{\sum_{라인}P(불량 | 라인)P(라인)}} \\
&= {P(불량 | 2번)P(2번) \over{P(불량 | 1번)P(1번) + P(불량 | 2번)P(2번) + P(불량 | 3번)P(3번)}} \\
&= {{0.06 * 0.5}\over{0.02 * 0.3 + 0.06 * 0.5 + 0.01 * 0.2}} \\
&= 0.789
\end{align}
$$

즉 우리가 쉽게 알 수 있는 확률들을 활용하여 일어나지 않은 사건에 대한 사후확률을 어느정도 예측이 가능하다는 것이다.

베이지안 최적화

위의 개념을 가지고 하이퍼파라미터를 찾는 과정은 아래와 같이 표현이 가능하다.

$$
P(model | data) \propto P(data | model) P(model)
$$

즉, 현재까지 얻은 모델 P(model)과 추가적인 데이터 P(data|model)을 사용해서 P(model | data)를 추정해나가는 방식대략적인 BO의 과정은 아래와 같다. 매 스텝마다 observation을 바탕으로 우리가 추정하고자 하는 f(x)의 예측 궤도를 그린다. 이때 사용하는 것이 surrogate function으로 많은 함수들이 있지만 대표적으로 gaussian process를 사용한다. surrogate function은 각 데이터 포인트마다 평균과 분산을 계산하며 검은색 실선이 평균, 파란색 영역이 분산(uncertainty)를 나타낸 것이다. 평균도 대부분의 경우 0을 사용한다. surrogate function이 예측을 끝냈다면 acquisition function 은 surrogate function의 성능을 높여주기 위한 다음 데이터 포인트를 찾아낸다. 이 함수도 여러 함수가 있지만 대부분 Expected Improvement라는 기법을 사용하며 surrogate function에서 평균, 분산이 모두 큰 지점을 찾아내는 것이 목표이다.

알고리즘

가우시안 프로세스를 사용한다는 가정하에 베이지안 최적화는 아래의 식으로 진행된다.

새로운 데이터 포인트를 추가했을때 $f^*$ 는 위처럼 업데이트된다. 처음에 수식을 봤을때는 어떻게 분산을 새롭게 계산하는지 이해를 못했다. (이렇게 할 경우 무조건 분산이 1 이 나와야하는 것 아닌가라고 생각했기 때문에..) 위 과정에 대한 설명은 없이 커널함수만 설명해놓은 포스트가 많았다. 그리고 검색을 더 해보다가 설명이 좋은 포스트를 찾아냈다.

 

Gaussian processes - Martin Krasser's Blog

Sources: Series: Introduction In supervised learning, we often use parametric models $p(\mathbf{y} \lvert \mathbf{X},\boldsymbol\theta)$ to explain data and infer optimal values of parameter $\boldsymbol\theta$ via maximum likelihood or maximum a posterior

krasserm.github.io

즉, 우리가 가지고있는 데이터들로만 구성된 벡터와 모든 데이터(mesh)에 대해 cov 행렬을 구하는 것.

  • x_train : n 데이터 → K : n * n 행렬
  • x* : m 데이터 → K* : n * m 행렬
  • K** : m * m 행렬
  • mu* : (m, n) X (n, n) X (n, 1) : (m, 1) 의 벡터
  • cov* = (m, m) - (m,n)(n,n)(n,m) = (m, m)의 행렬

코드 구현

가우시안 커널

import numpy as np

def kernel(X1, X2, l=1.0, sigma_f=1.0):
    """
    Isotropic squared exponential kernel.

    Args:
        X1: Array of m points (m x d).
        X2: Array of n points (n x d).

    Returns:
        (m x n) matrix.
    """
    sqdist = np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T)
    return sigma_f**2 * np.exp(-0.5 / l**2 * sqdist)

Posterior

from numpy.linalg import inv

def posterior(X_s, X_train, Y_train, l=1.0, sigma_f=1.0, sigma_y=1e-8):
    """
    Computes the suffifient statistics of the posterior distribution 
    from m training data X_train and Y_train and n new inputs X_s.

    Args:
        X_s: New input locations (n x d).
        X_train: Training locations (m x d).
        Y_train: Training targets (m x 1).
        l: Kernel length parameter.
        sigma_f: Kernel vertical variation parameter.
        sigma_y: Noise parameter.

    Returns:
        Posterior mean vector (n x d) and covariance matrix (n x n).
    """
    K = kernel(X_train, X_train, l, sigma_f) + sigma_y**2 * np.eye(len(X_train))
    K_s = kernel(X_train, X_s, l, sigma_f)
    K_ss = kernel(X_s, X_s, l, sigma_f) + 1e-8 * np.eye(len(X_s))
    K_inv = inv(K)

    # Equation (7)
    mu_s = K_s.T.dot(K_inv).dot(Y_train)

    # Equation (8)
    cov_s = K_ss - K_s.T.dot(K_inv).dot(K_s)

    return mu_s, cov_s

 

위의 식을 바탕으로 새로운 평균, 분산 mu_s, cov_s를 계산해서 그에 맞게 그래프를 그리는 것이다.

'2. Machine, Deep Learning' 카테고리의 다른 글

Regularization  (0) 2022.10.20

+ Recent posts