SELECT
COUNTIF(fullVisitorId IS NULL) AS fullvisitid_null_count,
COUNTIF(channelGrouping IS NULL) AS channelGrouping_null_count,
COUNTIF(totals IS NULL) AS totals_null_coun
FROM
`bubbly-team-441502-c6.GA_revenue_prediction.ga_train`
2. BigQuery에서 JSON 형식의 문자열로 저장된 데이터에서 특정 키의 값을 문자열로 추출 : JSON_EXTRACT_SCALAR
SELECT
JSON_EXTRACT_SCALAR(geoNetwork, '$.continent') AS continent,
COUNT(DISTINCT fullVisitorId) AS unique_visitors,
AVG(CAST(JSON_EXTRACT_SCALAR(totals, '$.pageviews') AS INT64)) AS avg_pageviews
FROM
`bubbly-team-441502-c6.GA_revenue_prediction.ga_train`
GROUP BY continent
ORDER BY unique_visitors DESC;
내장된 쿼리 엔진은 수 테라바이트의 데이터에 대한 SQL 쿼리를 단 몇초만에 처리하고, 수 페타바이트의 쿼리는 불과 몇 분이면 처리함
인프라를 별도로 관리 X
인덱스를 만들거나 재구성할 필요 X
서버리스에 내재한 단순함과 애드혹 쿼리 → 새로운 방식으로 작업 가능 → 인프라 운영할 필요 X
애드혹 쿼리 : 인덱스 같은 기능을 사용해 최상의 성능을 발휘하도록 미리 만들어 둔 데이터베이스에 쿼리하는 것이 아니라 필요에 따라(성능이 조금 떨어져도) 즉석에서 작성해 실행하는 쿼리
관계형 DB 관리 시스템
온라인 트랜잭션 처리(OLTP, Online Transaction Processing) 데이터베이스
장점
SQL을 지원함 → 자바나 파이썬과 같은 고수준 언어를 사용하지 않고도 DB 서버 관리 가능
단순히 DB 컬럼에서 raw 데이터를 가져오는 것 뿐만 아니라 그 이상의 작업도 가능함
데이터만 명시하면 데이터베이스 소프트웨어가 쿼리를 실행하는 최적의 방법을 스스로 찾아냄
OLTP 데이터베이스는 데이터 기록과 동시에 읽을 수 있도록 데이터 일관성 확보에 최적화 되어 있음. 이는 데이터 무결성 유지를 위해 데이터를 매우 조심스럽게 잠그기 때문
전체 데이터셋을 훑어야 하는 애드혹 쿼리 실행에는 적합 X
MySQL, PostgreSQL 등
맵리듀스 프레임워크
: 대용량 데이터 처리를 위해 여러 개의 맵리듀스 작업을 순차적으로 연결해 수행하는 방식
각 작업의 출력이 다음 작업의 입력으로 사용됨
키/값 쌍을 처리해 중간 키/값 쌍을 생성하는 map 함수, 동일한 중간 키와 연관된 모든 중간 값을 병합하는 reduce 함수 두 단계로 구성
위 패러다임은 아파치 하둡의 발전을 이끌었음
하둡 생태계는 주로 자바로 빌드된 라이브러리로 시작했지만, 현재는 일반저긍로 아파치 스파크로 하둡 클러스터에 대한 맞춤 분석을 수행
편도 대여 수를 확인하려면
HDFS(Hadoop Distributed File System)에서 CSV 텍스트 파일로 거래를 정기적으로 내보냄
애드혹 분석을 위해 다음을 수행하는 스파크 프로그램 작성
텍스트 파일의 데이터를 데이터프레임으로 불러옴
테이블 이름이 데이터프레임 이름으로 바뀌는 것을 제외하고, 앞에서 본 쿼리와 유사한 SQL 쿼리를 실행
결과를 다시 텍스트 파일로 내보냄
하둡 클러스터에서 스파크 프로그램 실행
아키텍처에서 필요한 비용 : HDFS에 데이터를 저장하려면 클러스터가 충분히 커야함 / 반드시 HDFS는 클러스터의 컴퓨팅 노드에 sharding 되어야 함 / 데이터의 크기와 분석의 필요성은 서로와는 무관하지만 양쪽 모두 크게 증가함 → 클러스터가 부족한 경우나 과도하게 프로비저닝 되는 경우가 존재함
sharding : 데이터베이스나 분산 시스템에서 데이터를 여러 개의 분할된 조각으로 나누어 저장하는 기술
ETL
데이터 웨어하우스를 사용하는 전통적인 방법은 ETL(Extract(추출), Transform(변환), Load(로드)) 프로세스로 시작함
소스 위치에서 raw 데이터를 추출하고 변환한 후 데이터 웨어하우스로 로드함
빅쿼리는 ETL을 매력적인 방법으로 만드는 매우 효율적인 컬럼 스토리지 포맷을 가지고 있음
아파치 빔 또는 아파치 스파크로 만든 데이터 파이프라인은 원시 데이터에서 필요한 만큼 추출하고 변환해 필요한 정리나 집계를 수행한 후 빅쿼리에 로드함
빅쿼리에서는 컴퓨팅과 스토리지가 분리되어 있어 구글 클라우드 스토리지에 현재 저장된 csv 파일에 빅쿼리 SQL쿼리 실행 가능 = 통합 쿼리(federated query) 기능
EL
변환이 필요하지 않으면 빅쿼리는 CSV, JSON 또는 아브로와 같은 네이티브 스토리지에 직접 접근 가능 ⇒ EL 워크플로우도 가능함
네이티브 스토리지 : 데이터를 클라우드 또는 소프트웨어에 종속되지 않고, 로컬 환경에 맞게 설계된 스토리지
데이터를 데이터 웨어하우스로 로드하는 이유? : 네이티브 스토리지에 저장할 때 쿼리 성능이 가장 효율적이기 때문
가능하다면 EL 워크플로우를 설계하고, 변환이 필요한 경우에만 ETL 워크플로우로 넘어가는 것이 좋음
이때 가능하면 데이터 변환을 SQL로 수행하고 빅쿼리 내에 전체 ETL 파이프라인을 유지하는 것이 좋음
변환이 SQL만으로 구현하기 어렵거나 파이프라인에 데이터를 빅쿼리로 스트리밍 해야한다면 아파치 빔 파이프라인을 만들어 클라우드 데이터플로우를 사용하는 서버리스 방식으로 실행함
ELT
: 원시 데이터를 그대로 추출해 로드한 다음 빅쿼리 뷰로 해당 데이터를 즉시 변환하는 방법
원시 데이터의 스키마가 유동적일 때 유용함
EX) 특정 시각을 현지 시각으로 수정해야할지 결정하고자 행마다 값을 탐색해야하는 경우
빅쿼리의 장점 1 - 강력한 분석
SQL 엔진이라서 태블로, 루커, 구글 데이터 스튜디오 같은 다양한 BI 도구 사용 가능
빅쿼리 확장 기능으로 머신러닝 모델 생성과 배치 예측 작업을 지원함
⇒ 빅쿼리에서 데이터를 내보내지 않고도 모델을 학습하고 예측할 수 있음
배치 데이터와 스트리밍 데이터 수집 모두 지원함
REST API를 통해 빅쿼리로 직접 데이터 스트리밍 가능
REST API(Representational State Transfer) : 웹 어플리케이션에서 데이터를 교환할 때 사용하는 아키텍처 스타일. HTTP 프로토콜을 기반으로 함
빅쿼리의 장점 2 - 관리의 단순함
스토리지가 완전한 관리형 → 데이터를 적재할 때 스토리지의 종류나 속도 및 비용의 트레이드오프를 생각할 필요가 없음
대표적인 이미지 생성 모델들 - GAN, VAE, Flow-base model, Diffusion
모두 생성 모델링을 위한 딥러닝 아키텍처에 속함
생성 모델: 입력 이미지에 대한 분포 p(x)를 학습해 새로운 이미지(새로운 이미지이면서 기존 이미지에서 특성을 추출했기에 최대한 입력이미지와 유사한 이미지)를 생성하는 것을 목표로 함
1. GAN (Generative Adversarial Networks)
상호 적대적인 생성자(generator, G)와 판별자(Discriminator, D)라는 두 개의 신경망을 이용한 적대적 생성 모델
생성자는 주어진 데이터 분포와 유사한 새로운 데이터를 생성하고, 판별자는 생성된 데이터와 실제 데이터를 구별함
생성자와 구별자는 경쟁을 통해 성능을 개선시키고, 생성자는 실제 데이터와 구별할 수 없는 데이터를 생성하게 됨
장점 : 1. 다양한 데이터 학습이 가능 2. 기존의 생성 모델보다 정교한 데이터 생성 가능
단점 : 1. 많은 양의 데이터가 요구됨 2. 안정적인 학습이 어려울 수 있음
2. VAE (Variational Autoencoder)
input data를 가장 잘 표현하는 feature를 추출해 latent vector z를 통해 X와 유사하지만 새로운 데이터를 생성해내는데 목표를 가짐
이미지의 latent space에서 sampling해 완전히 새로운 이미지나 기존 이미지를 변형하는 방식을 사용함
이때 사용되는 확률분포 z는 latent vector라고 불림
encoder: x를 입력받아 z와 대응되는 평균과 분산을 구하는 네트워크 = q(z|x)
decoder: z를 입력받아 x와 대응되는 평균과 분산을 구하는 네트워크 = p(x|z)
Autoencoder(AE)와 확률적 요소를 결합한 모델
Autoencoder: 데이터의 압축(or 차원 축소) 및 잠재 변수(latent variable) 표현을 학습하는 데 사용되는 신경망 아키텍처
결정론적 모델로 입력 데이터를 고정된 잠재 변수 표현으로 매핑하고 디코딩함(VAE는 확률 분포를 사용해 잠재 변수 모델링함)
VAE는 데이터 생성과 잠재 변수 공간에서의 탐색에 적합한 모델인 반면, Autoencoder는 주로 데이터 압축 및 잠재 변수 표현에 중점을 둔 모델
오토인코더처럼 Unsupervised Learning이기 때문에 입출력이 같기를 원하는 상황은 똑같지만, VAE는 latent vector가 평균 분산으로 이루어진 가우시안 분포를 가지게 되고, AE는 잠재 코드가 어떠한 행렬로 나오게 됨
훈련 목적 함수로 ELBO(Evidence Lower Bound)를 사용하며, 이를 최대화하는 방식으로 훈련됨
ELBO: 잠재 변수 Z에 대한 관측 데이터 X의 로그 우도와 잠재 변수의 확률 분포와 사전 확률 분포 간의 Kullback-Leibler(KL) 발산의 합으로 구성됨
인코더는 가우시안 분포를 따르는 것으로 가정하고, 이 분포에서 평균과 분산을 출력함
하지만 현실적으로 Z의 분포 전체를 샘플링하는 것이 어렵기에 Reparmeterization Trick을 이용해 평균 + 분산*(가우시안 분포 랜덤 샘플링)을 해준 값을 Z(latent vector)로 가정함
3. Flow-based models
확률 밀도 함수를 모델링하기 위한 생성 모델로, 확률 분포의 변환 표현 Flow를 사용함
Flow: 데이터 분포를 변환하면서 확률 분포를 추론하는 방법
잠재 벡터 z의 확률 분포에 대한 일련의 역변환을 통해 데이터 x의 분포를 명시적으로 학습하며 이를 간단하게 negative log-likelihood로 해결함
생성에 활용되는 inverse mapping을 학습하기 위해 invertible function을 학습함
훈련이 비교적 안정적이고 수렴하기 쉽다는 특징이 있음
4. Diffusion
Diffusion(확산) : 특정한 데이터 패턴이 서서히 반복을 거쳐 와해되는 과정
Diffusion 모델은 학습된 데이터의 패턴을 생성해내는 역할을 하는데, 이러한 패턴 생성 과정 학습을 위해 고의적으로 패턴을 무너뜨리고(Noising)(=forward diffusion process) 이를 다시 복원하는 조건부 확률 밀도 함수를 학습함(Denoising)(=reverse diffusion process)
forward diffusion process : t-1 시점에서 t 시점으로 노이즈를 manual하게 점점 추가해나감 → 사전 정의된 guassian 분포에서 생성됨(우리가 연산을 알 수 있음)
reverse diffusion process: 수학적으로 변환하기 어려움 & 학습하는 과정 필요
noising과 denoising을 하나의 단일 step transformation으로 학습하는 것은 매우 어려운 과제이기에 여러 단계로 쪼개어진 Markov Chain으로 각 process를 구성함
VAE는 하나의 latent vector로 수행한다면, Diffusion은 sequential한 여러 개의 latent vector를 사용함
8개의 각 헤드에 대해서 Q 에 대한 각 key 값 value 를 구해주고 각각 inner product 곱하고 곱하고 즉, 일대일로 대응 했었음
각각의 KV 텐서를 로드하기 위해서는 많은 메모리가 필요
Multi-query Attention은 H개의 Q(Query)와 1개의 KV(Key, Value)를 가짐
모든 헤드들의 개수에 대해서 하나만 수행하는 것
모든 Q(Query)는 KV(Key, Value)를 공유함
Multi-query Attention으로 메모리를 절약할 수 있음
Grouped-query attention
하나의 key로 계산, 하나의 value로 계산하여 컴퓨팅 타임을 줄이는 대안
Grouped query attetion 그림에서 보면 멀티 헤드 어텐션 부분에서 2개의 key가 아닌 하나의 key 사용
각 Qeury에 대해서 Value도 마찬가지로 두 개 중 하나만 계산
=> GQA : MHA와 MQA의 중간. H개 있던 KV 헤드를 1개로 줄이는 대신 적절한 G개의 그룹으로 줄이는 것
GQA는 Multi-query Attention 만큼 빠르며 성능은 Multi-head Attention과 비슷함
Structure
normal transformer block의 pre-normalization variant를 사용함
많은 transformer 구조가 layer normalization을 채택해 사용하고 있지만, LLAMA는 RMS Norm(Root Mean Square Layer Normalization)으로 layer normalization을 대체해 사용함
연산이 단순화된 기법이기 때문에 layer normalization에 비해 10~50% 향상된 효율성을 달성함
RMS Normalization
RMS Normalization은 배치 정규화(γ,β)와 같은 학습 가능한 파라미터가 없음
Batch Normalization은 매우 크거나 매우 작은 숫자를 다룰 때 수치불안정으로 인해 어려움을 겪을 수 있음
-> RMS Normalization은 루트 씌우고 n으로 나눠주고 실제 입력 값에 나눠주기 때문에 안정적임
모델에 비선형성을 제공해 데이터에서 더 복잡한 패턴 포착할 수 있음
Batch Normalization
배치당 평균과 분산 이용해 데이터의 분포를 정규화하는 과정
학습 파라미터 (γ,β)를 조정함으로써 데이터가 목표 평균(target mean) 및 표준 편차(standard deviation)을 갖도록 보장
학습 파라미터를 사용해 배치들이 중심인 전체 평균으로 끌어올 수 있도록 함
RoPE : Rotary Positional Embeddings
: LLAMA2와 같은 transformer model에서 위치 정보를 인코딩하는 방법.
모델이 입력 시퀀스의 위치 정보를 더 잘 학습할 수 있도록 돕는 방법
rotary matrix와 rotation matrix 개념이 사용됨
기존의 위치 임베딩이 입력 토큰에 정적 임베딩을 더하는 것과 달리 RoPE는 임베딩에 회전 행렬을 적용하여 위치를 동적으로 인코딩함
위치 정보를 포함하도록 두 차원 각각에 대해 일정 각도만큼 회전시킴
-> 토큰의 상대적 위치를 더 잘 포착할 수 있게 하여, 학습 중에 본 시퀀스보다 더 긴 시퀀스에서도 모델의 일반화 능력을 향상시킴
Rotation Matrix
: orthogonal 개념을 이용한 것
-> Attention Layer 에서 Query와 Key의 Inner product를 수행할 때, rotation matrix를 곱하여 위치 정보(postional information) 반영함
Rotary Matrix
: 입력 임베딩 벡터에 위치 정보를 통합함
임베딩 벡터의 실수와 허수 부분을 각각 회전시키며, 이 과정에서 벡터의 위치 정보가 보존되고 반영됨
여기서는 실수와 허수 두개를 표시해주어 Rotaion Matrix 상에서 대각선으로 표시해준 것
Query 와 Key 에 대해서만 Rotary Positional Embedding을 적용하는 것임
RoPE 적용 예시
로터리 포지션 임베딩은sinusoid 를 이용하여 구한 절대 포지션 값 θ 값을 입력
GQA
위에서 설명함
SwiGLU - Activation function
LLAMA는 SwiGLU라는 activation function을 사용하며 3개의 행렬 곱을 사용함
-> 일반적으로 사용되는 ReLU에 비해 계산 비용은 더 많이 들지만, 사용 중인 계산량이 일정하게 유지되는 상황에서도 다른 activation 함수에 비해 성능이 향상되는 장점이 존재함
SwiGLU = Swish(=SiLU) + GLU : 2개의 activation functions를 섞어 만든 함수
(-)값을 잃어버리는 ReLU의 단점을 해결함
1) Swish Function
sigmoid에 입력값을 한 번 더 곱해주는 모양
Swish function의 특징
1) Unbounded above where x ≥ 0
sigmoid & tanh는 각각 (0, 1), (-1, 1) 범위이지만 ReLU의 범위는 [0, ∞)
-> 이 점이 gradient vanish를 막아줌 (ReLU의 전성기를 가져온 큰 요인)
이러한 장점을 Swish가 이어받음
-> 모든 양수값을 허용함으로써 정보를 살려감
2) Bounded below where x < 0
위의 특성은 너무 큰 음수값은 0으로 내보내서 일종의 강한 규제(regularize 효과)를 거는 효과를 유도함
하지만 ReLU에서는 음수값에 대해서는 무조건 0을 내보내므로 dying ReLU에 직면한다는 단점이 존재
-> 파생형으로 Leaky ReLU나 PReLU 등장
< 0 구간에서 값의 상한이 존재하며, 0으로 수렴함
-> Swish는 어느 정도 작은 음수값에 대해서 허용한다는 의미 (3의 non monotonicity와도 이어짐)
3) Non monotonicity
약간의 음수를 허용하고 있고 양수 부분이 직선 그래프가 x = ReLU와 비슷하게 생겼지만 표현력이 좋다는 의미
gradient가 작은 음수로 전해지더라도 온전히 이전 layer로 전할 수 있어서 학습이 잘 됨
4) Smooth figure
ReLU는 작은 변화에도 민감하게 반응해 학습이 어려워질 수 있는데, Swish처럼 경계가 흐릿하면 ReLU와는 반대로 작은 변화에는 작게, 큰 변화에는 크게 반응해 optimizer가 제대로 minima를 찾아가게 함
5) Computationally expensive
sigmoid로 인해 계산 오래 걸림
6) Self-gated
입력의 정보량을 조절하는 기능
LSTM에서 나온 아이디어로써, x와 σ(βx)를 분리해 생각할 수 있음 σ(βx)는 항상 (0, 1) 범위의 값을 가지는데, 그 값을 결국 입력 자기자신 x가 결정하기 때문에 self-gating이라고 부름 -> 이 또한 generalization을 돕고 overfitting을 막아줌
2) GLU function : GatedLinearUnits
swish와 마찬가지로σ(xW+b)와 (xV+c)를 나누어 생각하면 (xV+c)가 σ(xW+b)의 Element-wise filter라고 이해할 수 있
3) SwiGLU
위의 두 가지를 결합한 형태
Architecture
LLAMA2는 decoder-based model -> 한 번에 하나의 토큰만 생성함
현재 레이어의 output은 다음 레이어의 input token이 됨 (Autoregressive)
I am a student -> student라는 output을 예측한다고 하면 아래와 같음
Pre-training
Llama1과 같이 공개된 데이터셋만으로 pre-training을 진행함
-> 충분한 컴퓨팅 소스를 갖고 있는 사람들이 pre-trained process를 공개적으로 복제할 수 있도록 하기 위함임 대신, Llama2는 공개된 데이터셋들을 그대로 이용하지 않고, 고품질이면서 사실로 판단된 소스들만 의도적으로 sampling하여 혼합된 데이터셋을 만들어 사용함
-> 여러 데이터셋의 고품질 내용만 혼합하여 pre-training dataset을 이전보다 40% 늘리고, 이로 인해 이전에 비해 보유한 지식의 기반이 더 향상됨
Supervised Fine-tuning
독점 모델(GPT-4)과 같이 광범위한 대화의 양과 인간 피드백에 의한 격차를 줄이기 위해 그와 유사한 방식으로 대규모 dataset을 사용해 fine-tuning된 Llama2-Chat을 생성함
= 가능한 완전 오픈소스를 제공하기 위한 노력의 일환
SFT의 두 단계를 수행함
STEP 1) 더 많은 양의 공개 데이터에 대해서 학습
STEP 2) 훨씬 더 높은 품질로 선별된 소규모 데이터에 대해서 학습
또한 LLAMA2-Chat은 위와 같이 alignment된 training 구조로 할루시네이션을 줄이고 unsafe question을 피하고자 함