오늘도 어김없이 HuggingFace를 둘러보다가 재미난 것을 발견했다.

 

 

텍스트로 음악을 생성할 수 있는 모델로 meta에서 만들걸로 보인다. 모델은 Transformer를 사용했으며 2024년에 발표된 논문으로 생각보다 최근에 발표된 모델이었다. 논문을 간단하게만 살펴보니 음악 생성 모델을 만드는게 생각보다 어려운 문제라고 한다. 자연어, 텍스트와 다르게 악보는 음표, 박자, 연주법 등 보이는 양보다 많은 정보가 담겨있기 때문에 이것을 숫자로 표현하는 것이 간단한 문제가 아니라고 한다. 

 

https://github.com/facebookresearch/audiocraft/blob/main/docs/MUSICGEN.md

 

audiocraft/docs/MUSICGEN.md at main · facebookresearch/audiocraft

Audiocraft is a library for audio processing and generation with deep learning. It features the state-of-the-art EnCodec audio compressor / tokenizer, along with MusicGen, a simple and controllable...

github.com

 

Huggingface, github 공식 설명에 따라서 python 음악 생성 코드를 작성했다. 모델 크기에 따라 small, medium, melody 모델이 있는데 small 모델은 정말 간단한 음악을 생성해주었고 melody 음악을 사용하면 적당히 들어줄 만한 음악이 생성되었다.

# Load model directly
from transformers import AutoTokenizer, AutoModelForTextToWaveform
import torch

# tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-melody")
# model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-melody")

# tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-medium")
# model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-medium")

tokenizer = AutoTokenizer.from_pretrained("facebook/musicgen-stereo-melody")
model = AutoModelForTextToWaveform.from_pretrained("facebook/musicgen-stereo-melody")

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)

inputs = tokenizer(
    text=["high quality", "clear sound", "how Ludwig van Beethoven felt when he realize that he is deaf"],
    padding=True,
    return_tensors="pt",
).to(device)

audio_values = model.generate(**inputs, max_new_tokens=1000)

import scipy

audio_values = audio_values.detach().cpu()
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out_stereo_melody.wav", rate=sampling_rate, data=audio_values[0, 0].numpy())

 

 

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 함수가 포함되어 있기 때문에 입력값은 확률값이 아니라 모델 출력을 그대로 넣어주어야 합니다.

1. 개요

 

GitHub - Hyunmok-Park/llm_project

Contribute to Hyunmok-Park/llm_project development by creating an account on GitHub.

github.com

2. 개발환경

datasets    2.16.1    
evaluate    0.4.1    
huggingface-hub    0.20.2    
numpy    1.24.4    
peft    0.7.1    
python    3.8.18    
scikit-learn    1.3.2    
tokenizers    0.15.0    
torch    2.1.2    
transformers    4.36.2    
typing-extensions    4.9.0

2. 세부 내용

  • 사용 모델은 distilbert-base-uncased 라는 모델로 자세히는 모르지만 아마 bert 기반의 모델로 추정된다. (distil 이라는 수식어가 붙어있으니 knowledge distilation과 연관이 있지 않을까 예상된다...)
  • 데이터셋은 허깅페이스의 shawhin/imdb-truncated 라는 데이터인데 영화 리뷰내용과 내용의 긍정 / 부정에 대한 라벨링으로 보인다.
  • 출처에서는 PEFT :Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware 라는 기법을 사용하여 fine-tuning을 진행하였다. 이에 대해서는 추가적으로 공부할 예정
  • PEFT는 한마디로 요약하면 적은 파라미터만을 조정하여 전체 파라미터를 조정하는것과 같은 효과를 내는 fine-tuning 기법으로 보여진다.

3. 결과

  • RTX3060을 기준으로 약 40분 / 1093MiB 소요

 

4. 추가 학습 필요

  • Tokenizer 개념 
  • PEFT 개념
  • distilbert-base-uncased 모델 개념
  • 사용 함수들 세부 조사
  • 데이터셋 구성 확인

 

 

1. 개요

  • Pycharm 사용중 내부 터미널에서 코드 실행 중 에러 발생

2. TroubleShoot

2.1 시도1

  • 파이썬 라이브러리끼리 참조과정 중에 발생하는 에러라는 글 발견
    • 해당 라이브러리(pyarrow) 삭제 후(pip uninstall) 재설치 진행(pip intstall)하였으나 version attribute가 없다는 에러 발생

2.2 시도2(해결)

  • 설치된 라이브러리가 제대로 반영되지 않은 것으로 판단되어 가상환경을 새로 생성하여 코드 실행하였더니 해결됨

+ Recent posts