- 리랭커는 binary classification task를 수행하는 모델
- Binary classification은 주어진 입력 데이터를 두 가지 범주 중 하나로 분류하는 작업
- 리랭커는 주로 sigmoid 함수를 적용한 후, BCE(Binary Cross-Entropy) 손실 함수를 사용하여 학습
- Sigmoid 함수는 입력 값을 0과 1 사이의 확률 값으로 변환해 주는 함수
- BCE 손실 함수는 예측된 확률 값과 실제 레이블 간의 차이를 계산하여 모델의 오차를 측정
- Threshold에 대하여 출력값 자체로는 0.5라는 값 자체에 특별한 의미가 있다고 보기 어렵지만, 학습 과정에서 사용되는 sigmoid 함수와 BCE 손실 함수의 특성 상 0.5라는 값이 두 범주를 구분하는 기준점으로 해석될 수 있음
- Hard negative mining: 첫 단계 모델에서 생성된 데이터셋을 사용하여 모델을 파인튜닝. 이 데이터셋은 모델이 구분하기 어려운 부정적인 샘플(hard negatives)을 포함하고 있어, 모델의 성능 향상에 도움을 준다.
- Group-wise training: 그룹 크기를 16으로 설정하고, 그룹 내에서 positive:negative 비율을 1:15로 유지하며 학습을 진행합니다. 이는 모델이 더 다양한 negative 샘플을 학습할 수 있도록 돕는다. 목적 함수와 평가 지표로는 Group CCE(Categorical Cross-Entropy) 또는 LCE(List-wise Cross-Entropy)를 사용할 수 있다.
- 입력 시퀀스의 최대 길이는 512로 설정되며, 학습 속도 향상을 위해 Mixed precision(FP16)을 사용합니다. 데이터 증강 기법으로 질문과 인용구를 무작위로 증강하며, 기울기 체크포인팅(Gradient Checkpointing)을 사용하여 메모리 사용량을 줄인다. 데이터 증강 기법은 더 테스트해볼 수 있다.
import pytorch_lightning as pl | |
import numpy as np | |
import torch | |
from torch.nn import MSELoss | |
from torch.optim import Adam | |
from torch.utils.data import DataLoader, Dataset | |
import torch.nn as nn | |
class SimpleDataset(Dataset): |
import cupy as cp | |
import numpy as np | |
from pylibraft.distance import pairwise_distance | |
from pylibraft.knn import brute_force_knn | |
def main(num_elements, dim): | |
# 데이터 생성 및 정규화 (CuPy 사용) | |
cp.random.seed(42) | |
data = cp.random.random((num_elements, dim)).astype(cp.float32) | |
norm_data = data / cp.linalg.norm(data, axis=1, keepdims=True) |
import argparse | |
import hnswlib | |
import numpy as np | |
def main(num_elements, dim): | |
# 데이터 생성 및 정규화 | |
np.random.seed(42) | |
data = np.random.random((num_elements, dim)).astype(np.float32) | |
norm_data = data / np.linalg.norm(data, axis=1)[:, None] |
2편: ‘모델 크기’와 ‘학습 토큰 수’의 적절한 비율은? | NeurIPS 2022 | 김택민
Gopher만큼 계산량이 있다면 63B → 1.4T에서 학습하는 것이 최적이라고 한다. 실제 현업에서는 관점 2가 조금 더 현실성이 있는데, pretrain을 하기 전에 이미 GPU를 사용했으므로 계산량이 고정되어 있는 상태. 최고의 정확도를 내기 위해서 모델 크기를 어떻게 조정해야 하는지 그래프를 통해서 결론을 낼 수 있을 것이다. 안드레 카파시도 nanoGPT에서 관점 2를 좋아한다고 언급했다.
Figure 3 > Figure 2 더 이해하기 편하다.
관점 1과 관점 2에서 얻은 데이터를 조금 더 잘 해석하는 방향으로 제안하는 것인데, 우리가 데이터 포인트를 400개 모았는데 최종 로스를 예측할 수 있는 모델을 만들면 어떨까? 라는 생각이고 샘 알트만도 내부 인터뷰를 통해서 최초 학습 조금 하면 최종 로스를 알 수 있다는 내용 말했음. 로스 예측 모델을 잘 이야기하면 모델 크기는 얼마나 되어야 하고 데이터셋은 얼마나 필요한지 잘 예측할 수 있을 것이다. GPU 스케줄링이 쉬워진다던지, 이 사람에게 몇 대를 빌려주면 되는지 등 잘 빌려주는 것이 좋을 수 있다. 저자들은 로스 예측 모델을 저렇게 생길 수 있지 않을까? 이야기했고. L-BFGS 알고리즘을 이용해서 Huber 로스를 최소화하는 방향으로 학습하면 파라미터를 채울 수 있다고 한다.
- Actor model 을 기반으로 만들어진 Akka는 몇 가지 Component로 구성
- Dispatcher: Actor System 내에서 실행되는 모든 코드를 스케줄링하며 각 Actor의 처리량과 시간 점유율을 조정하여 각자에게 공정한 리소스를 제공
- Mailbox: Dispatcher에서 들어오는 메시지를 담는 메시징 큐로 Actor마다 Mailbox를 가지고 있으며 들어온 메시지의 순서대로 Actor에서 소비
- Actor: 시스템을 구성하는 일종의 행위 객체로 메시지를 실질적으로 필요로 하는 소비자 및 송/수신자
- 계층구조
- Akka Actor 계층 구조는 트리 형태로 표현 가능
고등학교 과정에서 배우는 평균값 정리는 다음과 같다.
"함수 f가 닫힌구간 [a, b]에서 연속이고 열린구간 (a, b)에서 미분가능하면, f(b)-f(a)=f '(c)(b-a)를 만족하는 실수 c가 열린구간 (a, b)에 존재한다."
평균값 정리는 주어진 구간의 평균변화율과 접선의 기울기가 같아지는 어떤 점이 존재한다는 것을 말하고 있다. 반면에, 다음과 같은 명제는 어떨까?
"함수 f가 닫힌구간 [a, b]에서 연속이고 열린구간 (a, b)에서 미분가능하면, 열린구간 (a, b)에 속하는 임의의 c에 대하여 f(s)-f(t)=f '(c)(s-t), s<c<t를 만족하는 실수 s, t가 열린구간 (a, b)에 존재한다."
파이썬의 모든 것은 객체다. 당연하게 들릴 수 있으나 객체 지향 언어라고 하려 모든것이 객체인건 아니다. 예를 들어 자바의 거의 모든것은 객체지만, 원시 자료형 (Primitive Type)은 아니다. 그러나 파이썬은 숫자도 객체다.
>>> 42..__add__(3) # 점을 두개 붙어야 호출 가능하다 45.0
파이썬의 객체는 PyObject
로 이뤄져 있다. PyObject
는 Include
폴더의 object.h
에 다음과 같이 정의 되어 있다.
다음과 같은 PDO Exception 에러가 있다고 생각해보자.
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
RDS Host 이름을 찾을 수 없기 때문에 발생하는 문제이다.
가장 쉽게 해결하는 방법은 /etc/hosts
에 아이피와 해당 호스트를 직접 입력하면 해결이 되지만, 이거는 특정 도메인을 못 찾는 문제가 아니라 DNS 조회를 못하는 것이다.
우리의 컴퓨터는 다음 방법을 통해 도메인을 조회한다.