no image
[BigQuery] 함수들 정리
1. 결측값 여부 파악 : COUNTIFSELECT COUNTIF(fullVisitorId IS NULL) AS fullvisitid_null_count, COUNTIF(channelGrouping IS NULL) AS channelGrouping_null_count, COUNTIF(totals IS NULL) AS totals_null_counFROM `bubbly-team-441502-c6.GA_revenue_prediction.ga_train`  2. BigQuery에서 JSON 형식의 문자열로 저장된 데이터에서 특정 키의 값을 문자열로 추출 : JSON_EXTRACT_SCALAR SELECT JSON_EXTRACT_SCALAR(geoNetwork, '$.continent') AS c..
2024.11.12
no image
[GCP] GCS에서 BigQuery로 내부 테이블로 데이터 로드하기
Google Cloud Storage에서 BigQuery의 내부 테이블로 데이터를 로드 1. Google Cloud Storage에서 버킷에 데이터 로드2. 데이터 세트 만들기 3. Google Cloud Storage의 데이터 추가  이렇게 Google Cloud Storage에서 BigQuery 내부 테이블로 데이터를 로드할 수 있음로드된 후에는 빅쿼리의 내부 테이블로 쿼리할 수 있어서 더이상 외부 테이블처럼 GCS에 의존하지 않으므로 추가적인 읽기 비용이 발생하지 않음!
2024.11.12
no image
Best Data Science Projects for Beginners (Datasets)
💻 Best Data Science Projects for Beginners (Datasets) 🧾 | Kaggle 💻 Best Data Science Projects for Beginners (Datasets) 🧾 | Kaggle💻 Best Data Science Projects for Beginners (Datasets) 🧾.www.kaggle.com
2024.11.08
[구글 빅쿼리 완벽 가이드] Ch 1. 구글 빅쿼리란
Google BigQuery: 쿼리 엔진이 내장된 서버리스 서비스로, 확장성이 높은 데이터 웨어하우스내장된 쿼리 엔진은 수 테라바이트의 데이터에 대한 SQL 쿼리를 단 몇초만에 처리하고, 수 페타바이트의 쿼리는 불과 몇 분이면 처리함인프라를 별도로 관리 X인덱스를 만들거나 재구성할 필요 X서버리스에 내재한 단순함과 애드혹 쿼리 → 새로운 방식으로 작업 가능 → 인프라 운영할 필요 X애드혹 쿼리 : 인덱스 같은 기능을 사용해 최상의 성능을 발휘하도록 미리 만들어 둔 데이터베이스에 쿼리하는 것이 아니라 필요에 따라(성능이 조금 떨어져도) 즉석에서 작성해 실행하는 쿼리관계형 DB 관리 시스템온라인 트랜잭션 처리(OLTP, Online Transaction Processing) 데이터베이스장점SQL을 지원함 →..
2024.11.05
[GA4] GA4 환경 세팅
환경 세팅할 때 참고한 자료들  콘텐츠 마케터 교육 day23-GA4 계정 만.. : 네이버블로그 (naver.com) 콘텐츠 마케터 교육 day23-GA4 계정 만들고 실습하기-티스토리가상의 나의 사이트를 만들고 우리사이트에 GA4를 설치해보겠습니다. 티스토리 블로그로 실습을 할건데요...blog.naver.com[Google Analytics 4] 구글 애널리틱스 4 설치하기 (dachata.com) [Google Analytics 4] 구글 애널리틱스 4 설치하기구글 애널리틱스 4(Google Analytics 4) 속성을 설치하는 강의로 Google Tag Manager를 활용합니다. Universial Analytics에서 Google Analytics 4 이전을 위한 기능에 대해 알아봅니다.d..
2024.10.13
no image
GAN, VAE, Flow-based model, Diffusion
옛날에 노션에 정리했던 내용인데 지우긴 아까워서 업로드함  대표적인 이미지 생성 모델들 - GAN, VAE, Flow-base model, Diffusion모두 생성 모델링을 위한 딥러닝 아키텍처에 속함생성 모델: 입력 이미지에 대한 분포 p(x)를 학습해 새로운 이미지(새로운 이미지이면서 기존 이미지에서 특성을 추출했기에 최대한 입력이미지와 유사한 이미지)를 생성하는 것을 목표로 함1. GAN (Generative Adversarial Networks)상호 적대적인 생성자(generator, G)와 판별자(Discriminator, D)라는 두 개의 신경망을 이용한 적대적 생성 모델생성자는 주어진 데이터 분포와 유사한 새로운 데이터를 생성하고, 판별자는 생성된 데이터와 실제 데이터를 구별함생성자와 구별..
2024.09.20
AI
no image
[CS231N] Lecture 4 - Introduction to Neural Networks
유한 차분은 수치적(numerical)한 방법으로 경사 계산 가능 -> 추정값이지만 동시에 작성하기 쉬움분석적 경사 : 일단 분석적 경사에 대한 표현을 얻으면, 이걸 유도하기 위해 모든 수학과 미분을 해야함 → 실수하기 쉬움동시에 우리의 구현을 수치적 경사로 확인해 수학을 제대로 했는지 확인하는 것실제에서 우리가 하고 싶은 것 = 분석적 경사를 유도해서 사용하는 것임의의 복잡한 함수에 대해 어떻게 분석적 경사를 계산하는가? = 계산 그래프(computational graph)사용! (일종의 프레임워크) Computational graphs앞의 강의들에서 배운 내용들을 아래와 같이 computational graphs 형태로 표현할 수 있음computational graphs의 장점1. input과 loc..
2024.09.03
no image
[논문 리뷰] Llama 2
Meta Llama 2 Meta Llama 2Llama 2 was pretrained on publicly available online data sources. The fine-tuned model, Llama Chat, leverages publicly available instruction datasets and over 1 million human annotations.llama.meta.com Llama : 가장 강력한 오픈 소스 대형 모델이었으나, 오픈 소스 계약으로 인해 상업적 용도로 무료로 사용할 수 없었음-> 무료 상용 버전으로 출시된 Llama 2연구용과 상업용으로 사용 가능한 foundation model(LLALA2) & fine-tuned chat 모델(LLAMA2-Chat) 두 ..
2024.07.30

1. 결측값 여부 파악 : COUNTIF

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;

데이터 예시

 

3. 고윳값 : DISTINCT 

위 코드 참고

Google Cloud Storage에서 BigQuery의 내부 테이블로 데이터를 로드

 

1. Google Cloud Storage에서 버킷에 데이터 로드

2. 데이터 세트 만들기

 

3. Google Cloud Storage의 데이터 추가

 

 

이렇게 Google Cloud Storage에서 BigQuery 내부 테이블로 데이터를 로드할 수 있음

로드된 후에는 빅쿼리의 내부 테이블로 쿼리할 수 있어서 더이상 외부 테이블처럼 GCS에 의존하지 않으므로 추가적인 읽기 비용이 발생하지 않음! 

 

'GCP > BigQuery' 카테고리의 다른 글

[BigQuery] 함수들 정리  (0) 2024.11.12
[구글 빅쿼리 완벽 가이드] Ch 1. 구글 빅쿼리란  (3) 2024.11.05

💻 Best Data Science Projects for Beginners (Datasets) 🧾 | Kaggle

 

💻 Best Data Science Projects for Beginners (Datasets) 🧾 | Kaggle

💻 Best Data Science Projects for Beginners (Datasets) 🧾.

www.kaggle.com

'메모' 카테고리의 다른 글

로컬에서 서버로 파일 보내기  (0) 2024.07.16

Google BigQuery

: 쿼리 엔진이 내장된 서버리스 서비스로, 확장성이 높은 데이터 웨어하우스

  • 내장된 쿼리 엔진은 수 테라바이트의 데이터에 대한 SQL 쿼리를 단 몇초만에 처리하고, 수 페타바이트의 쿼리는 불과 몇 분이면 처리함
  • 인프라를 별도로 관리 X
  • 인덱스를 만들거나 재구성할 필요 X
  • 서버리스에 내재한 단순함과 애드혹 쿼리 → 새로운 방식으로 작업 가능 → 인프라 운영할 필요 X
    • 애드혹 쿼리 : 인덱스 같은 기능을 사용해 최상의 성능을 발휘하도록 미리 만들어 둔 데이터베이스에 쿼리하는 것이 아니라 필요에 따라(성능이 조금 떨어져도) 즉석에서 작성해 실행하는 쿼리

관계형 DB 관리 시스템

온라인 트랜잭션 처리(OLTP, Online Transaction Processing) 데이터베이스

  • 장점
    • SQL을 지원함 → 자바나 파이썬과 같은 고수준 언어를 사용하지 않고도 DB 서버 관리 가능
    • 단순히 DB 컬럼에서 raw 데이터를 가져오는 것 뿐만 아니라 그 이상의 작업도 가능함
    • 데이터만 명시하면 데이터베이스 소프트웨어가 쿼리를 실행하는 최적의 방법을 스스로 찾아냄
  • OLTP 데이터베이스는 데이터 기록과 동시에 읽을 수 있도록 데이터 일관성 확보에 최적화 되어 있음. 이는 데이터 무결성 유지를 위해 데이터를 매우 조심스럽게 잠그기 때문
    • 전체 데이터셋을 훑어야 하는 애드혹 쿼리 실행에는 적합 X
  • MySQL, PostgreSQL 등

맵리듀스 프레임워크

: 대용량 데이터 처리를 위해 여러 개의 맵리듀스 작업을 순차적으로 연결해 수행하는 방식

각 작업의 출력이 다음 작업의 입력으로 사용됨

  • 키/값 쌍을 처리해 중간 키/값 쌍을 생성하는 map 함수, 동일한 중간 키와 연관된 모든 중간 값을 병합하는 reduce 함수 두 단계로 구성
  • 위 패러다임은 아파치 하둡의 발전을 이끌었음
    • 하둡 생태계는 주로 자바로 빌드된 라이브러리로 시작했지만, 현재는 일반저긍로 아파치 스파크로 하둡 클러스터에 대한 맞춤 분석을 수행
  • 편도 대여 수를 확인하려면
    1. HDFS(Hadoop Distributed File System)에서 CSV 텍스트 파일로 거래를 정기적으로 내보냄
    2. 애드혹 분석을 위해 다음을 수행하는 스파크 프로그램 작성
      1. 텍스트 파일의 데이터를 데이터프레임으로 불러옴
      2. 테이블 이름이 데이터프레임 이름으로 바뀌는 것을 제외하고, 앞에서 본 쿼리와 유사한 SQL 쿼리를 실행
      3. 결과를 다시 텍스트 파일로 내보냄
    3. 하둡 클러스터에서 스파크 프로그램 실행
    • 아키텍처에서 필요한 비용 : 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 - 관리의 단순함

  • 스토리지가 완전한 관리형 → 데이터를 적재할 때 스토리지의 종류나 속도 및 비용의 트레이드오프를 생각할 필요가 없음
  • 인프라 스트럭쳐를 직접 구축하지 않아도 되므로 보안을 신경 써야 하는 번거로움이 줄어듦

'GCP > BigQuery' 카테고리의 다른 글

[BigQuery] 함수들 정리  (0) 2024.11.12
[GCP] GCS에서 BigQuery로 내부 테이블로 데이터 로드하기  (0) 2024.11.12

[GA4] GA4 환경 세팅

als13w
|2024. 10. 13. 18:47

환경 세팅할 때 참고한 자료들

 

 

콘텐츠 마케터 교육 day23-GA4 계정 만.. : 네이버블로그 (naver.com)

 

콘텐츠 마케터 교육 day23-GA4 계정 만들고 실습하기-티스토리

가상의 나의 사이트를 만들고 우리사이트에 GA4를 설치해보겠습니다. 티스토리 블로그로 실습을 할건데요...

blog.naver.com

[Google Analytics 4] 구글 애널리틱스 4 설치하기 (dachata.com)

 

[Google Analytics 4] 구글 애널리틱스 4 설치하기

구글 애널리틱스 4(Google Analytics 4) 속성을 설치하는 강의로 Google Tag Manager를 활용합니다. Universial Analytics에서 Google Analytics 4 이전을 위한 기능에 대해 알아봅니다.

dachata.com

티스토리 - 구글 애널리틱스(GA4) 연결하는 방법 따라하기 (mimmi.co.kr)

 

티스토리 - 구글 애널리틱스(GA4) 연결하는 방법 따라하기

티스토리를 활용해서 수익형 블로그를 운영하는 과정에서 가장 중요한 부분이 애널리틱스 등의 툴로 자기의 블로그를 분석하는 단계입니다. 분석 없이 글을 쓰다보면 한 단계 성장하기 보다 계

tistory.mimmi.co.kr

 

옛날에 노션에 정리했던 내용인데 지우긴 아까워서 업로드함 


 

대표적인 이미지 생성 모델들 - 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를 사용함

 


Flow based Generative Models 1 : Normalizing Flow - DevKiHyun’s Deep Learning

VAE(Variation Auto Encode.. : 네이버블로그 (naver.com)

 

VAE(Variation Auto Encoder)의 이론과 수식을 알아보자

참고자료 : KAIST 강남우 교수님의 딥러닝과 설계 강의 VAE란 무엇인가? Input Data를 가장 잘 ...

blog.naver.com

디퓨전 Diffusion 모델과 DDPM 원리.. : 네이버블로그 (naver.com)

 

디퓨전 Diffusion 모델과 DDPM 원리 이해하기

Reference : 고려대 산업경영공학부 DSBA 연구실 유튜브 What is Diffusion? Diffusion = 확...

blog.naver.com

 

'AI' 카테고리의 다른 글

text-to-image(txt2img)  (0) 2024.05.05

 

  • 유한 차분은 수치적(numerical)한 방법으로 경사 계산 가능 -> 추정값이지만 동시에 작성하기 쉬움
  • 분석적 경사 : 일단 분석적 경사에 대한 표현을 얻으면, 이걸 유도하기 위해 모든 수학과 미분을 해야함 → 실수하기 쉬움동시에 우리의 구현을 수치적 경사로 확인해 수학을 제대로 했는지 확인하는 것

실제에서 우리가 하고 싶은 것 = 분석적 경사를 유도해서 사용하는 것

임의의 복잡한 함수에 대해 어떻게 분석적 경사를 계산하는가? = 계산 그래프(computational graph)사용! (일종의 프레임워크)

 

Computational graphs

앞의 강의들에서 배운 내용들을 아래와 같이 computational graphs 형태로 표현할 수 있음

computational graphs의 장점

1. input과 local gradient 값을 쉽게 파악할 수 있고, 복잡한 형태의 analytic gradient(앞 강의에서 설명한 해석적 방식)를 보다 쉽게 계산해낼 수 있음

2. 일단 계산 그래프로 함수를 표현하면 역전파(backpropagation)의 테크닉 사용 가능 -> 반복적으로 체인 룰(chain rule)을 사용해 계산 그래프의 모든 변수에 대해 gradient를 얻음

 

 

 

대략적인 순서는 아래와 같음

  • 함수에 대한 computational graph 만들기
  • 각 local gradient 구해놓기
  • chain rule
  • z에 대한 최종 loss L은 이미 계산되어 있음
  • 최종 목표는 input에 대한 gradient를 구하는 것

 

Backpropagation

Chain Rule 이용해 backpropagation 가능

목표 : 함수를 가지는 것

 

문제 1

아래와 같이 하나의 Computation Node에 대해 국소적으로 볼 수 있음

이런 국소적 상황에서는 보다 쉽게 gradient 값을 각각 구할 수 있음

  • 더하기 노드 다음의 중간 변수 : q -> q = x+y, f =qz
  • x와 y에 대한 q의 경사 : 1 <- 더하기 때문
  • q와 z에 대한 f의 경사 : 각각 q와 z <- 곱하기 규칙 때문

=> 목표 : x, y, z에 대한 f의 경사를 찾는 것

 

뒤에서부터 차례로 gradient 값 구하기 가능

마지막 값의 gradient는 1임

다음 z 값에 대한 gradient 값 = q

다음 q 값에 대한 gradient 값 = z -> 따라서 z = -4 값을 가짐

 

x와 y에 대한 값(df / dq)을 계산하기 위해 앞에서 계산한 gradient 값과 현재 local gradient 간에 chain rule 적용 가능함

  • y에 관한 경사는 f와 직접적으로 연결되어 있지 않기 때문에 중간 노드인 q를 통해 연결하는 것

결과적으로 q 값에 대한 f의 gradient와 y값에 대한 q의 gradient를 곱하면 -4 * 1 = -4

x값 또한 -4 * 1 = -4 를 가짐을 backpropagation을 통해 유추할 수 있음

 

 

위의 설명을 더 보기 쉽게 그림으로 설명할 수 있음

 

x와 y값을 입력으로 받고 f라는 함수에 넣어서 z 라는 값을 얻어냄

이때 z를 x로 미분한 값과 z를 y로 미분한 값을 얻어낼 수 있는데, 이를 local gradient 값이라고 함

 

역전파를 할 때, 우리는 제일 뒤에서 시작함 & 끝에서 시작점으로 작업해나감

각 노드에 도달할 때 각 노드에서 직접적인 출력에 대한 거꾸로 오는 업스트림 경사(upstream gradient)를 갖게 됨

그래서 역전파에서 이 노드에 도달할 쯤에, 우리는 이미 z에 대한 우리의 최종 손실 L에 대한 경사를 계산한 것임

 

다음으로 찾고 싶은 것은 노드 바로 앞의 것, x와 y값에 대한 경사임 -> chain rule을 이용함

x에 대한 이 손실 함수의 경사는 (z에 대한 경사) * (이 x에 대한 z의 지역 경사) 

따라서 체인 룰에서 항상내려오는 upstream gradient를 받아 지역 경사로 곱해 입력에 대한 경사를 얻음

  • y에 대한 L의 경사도 같은 아이디어 적용함

 

 

 

즉, 각각의 노드에서 지역 경사를 얻고 역전파 중에 업스트림으로부터 오는 수치적 경사값들을 받아서 그걸 local gradient로 곱함

그리고 이 값을 연결된 노드, 즉 뒤쪽에 있는 다음 노드로 전달하는 것

 

이렇게 입력을 받고 loss값을 구하는 계산 과정을 forward pass라고 하고,

forward pass가 끝난 이후 역으로 미분해가며 기울기 값을 구해가는 과정은 backward pass라고 부름

 

몇가지 게이트 법칙은 아래와 같음

  • add gate: 비율만큼 나눠줌
  • max gate: 하나만 실제로 영향을 주는 값이다. 그쪽만 gradient 가짐
  • 하나의 노드에서 forward로 Multi로 나가면 역전파할때 gradient 더해줘야됨

 

문제 2

더 복잡한 예로는 아래와 같음

빨간색 박스가 upstream gradient인데, 이 값을 이용해 지역 경사를 계산할 수 있음

df / dx = -1/x^2 인데 여기에 순방향에 사용했던 x 값인 1.37을 대입해 계산하면 -0.53이 됨

 

 

업스트림으로부터의 경사가 -0.53이고, 지역 노드는 +1

아래쪽의 c + x에 대해서는 지역 경사가 1이므로 체인 룰을 사용하면 경사는 -0.53이 됨

 

위 과정을 반복하다보면 w0과 x0에 도달하게 되고, 모든 변수에 대한 경사를 얻을 수 있게 됨

이때 x1과 w1에 대한 경사도 같은 방식으로 적을 수 있음

 

 

주의할 점은 계산 그래프를 만들 때 계산 노드를 우리가 원하는 입상(granularity)으로 정의할 수 있다는 것임

즉, 우리가 할 수 있는 만큼 완전히 간단하게 쪼갤 수 있다는 것

  • 계산 그래프를 만들 때, 계산을 얼마나 세분화할지(즉, 입상을 얼마나 세밀하게 할지) 선택할 수 있음. 아주 세밀하게 나눌 수도 있고, 여러 단계들을 묶어서 하나의 큰 단계로 만들 수도 있음

 

아래의 파란색 박스는 sigmoid 함수와 같은 형태로, 미분 결과는 (1-sigmoid(x)) * sigmoid(x) 와 같은 형태를 가짐

시그모이드 함수를 하나의 노드로 만들어 계산 그래프에 추가해 여러 과정을 skip하고 간단하게 계산 할 수 있게 됨

아래의 예시와 같이 전체 시그모이드를 하나의 노드로 취급해서 sigmoid(x)의 출력값인 0.73를 이용하면 loss = (1-0.73) * 0.73 = 0.2 의 값을 가지는 것을 볼 수 있음

즉, 이 지역 경사 값이 0.2이므로 업스트림 경사인 1을 곱하면 정확히 시그모이드 사용 이전의 더 작은 계산으로 쪼갰을 때의 경우와 동일한 값을 얻을 수 있는 것임

 

계산 그래프를 세밀하게 만들면 각 단계가 단순해지지만, 그래프 자체는 복잡해지는 trade-off 관계가 존재함

  • 반대로 여러 단계들을 묶으면 그래프는 간단해지지만, 각 노드에서 수행해야 하는 계산이 복잡해짐

-> 둘 사이의 균형을 맞추는 것이 중요함

 

경사 계산이 어렵다면 계산 그래프로 문제를 시각화하고 체인 룰을 이용해 문제를 해결할 수 있음

 

인풋이 벡터인 경우는 gradient가 아닌 Jacobian을 계산해주면 됨

  • Jacobian matrix : 각 요소의 미분을 포함하는 행렬
  • Jacobian 행렬은 야코비 행렬이라고 함. 한국에서 번역 과정에서 자코비안이나 야고비나 다양하게 불리는 것 같

또한 입력의 각 요소는 출력의 해당 요소에만 영향을 주므로 대각 행렬임

 

 

 

문제 3

4096 차원의 입력 벡터 (CNN을 볼 때 흔히 보는 사이즈)가 있고, 이 노드는 원소마다의(element-wise) 최대값을 취해 줌

-> 우리가 x의 f가 0과 항목마다 x를 비교해 최대값인 거고, 출력은 4096 차원의 벡터가 되는 것

 

이 경우의 Jacobian matrix 사이즈는 [4096 * 4096]

-> 여기서 100개의 mini batch를 가지고 있을 경우 [409600 * 409600] 사이즈를 갖게 됨

= 사이즈가 너무 거대하기에 완전히 작업하는 것이 사실상 불가능

실제에서는 대부분의 경우 이 거대한 자코비안 행렬을 계산할 필요가 없는데 그 이유를 설명하면 아래와 같음

 

각 요소별로 최댓값을 갖는 지점에서 어떤 일이 일어나는지를 생각해본다면 그것은 각각의 편미분한 값과 이어질 것임

입력의 어떤 차원이 출력의 어떤 차원에 영향을 주는지, 그래서 Jacobian 행렬은 대각선 형태의 구조를 볼 수 있음

입력의 각 요소는 오직 출력의 해당 요소에만 영향을 주기 때문에 Jacobian 행렬은 대각 행렬이 될 것임

-> 실제로 공식화할 필요 없이 채워넣어서 사용하기만 하면 됨

 

문제 4

알고 싶은 것 : q에 대한 경사

q는 L2앞의 중간 변수로, 2차원 벡터

=> 목표 : q의 각 원소가 어떻게 f의 최종 값에 영향을 주는지 알아내는 것

ex : q1에 대한 f의 경사는 f(q) 미분하면 2q1이 됨 -> qi의 각 원소에 대한 표현을 벡터 형태로 쓰면 2*q로 놓을 수 있음

 

w에 대한 경사를 얻어 각 원소별로 계산할 수 있고, 이를 벡터화된 형식으로 적을 수 있음

이때 변수에 대한 경사를 항상 체크해야 하는데, 변수와 같은 형태를 가져야 함

  • 경사의 각 원소는 그 원소가 최종 출력에 얼마나 영향을 미치는 지 정량화한 것이기 때문

 

위를 벡터화된 형태로 적으면 아래와 같음

 

벡터의 gradient는 항상 원본 벡터의 사이즈와 같아야 함을 주의

 

위 과정들을 모듈화하면 아래와 같음

계산 그래프에서 노드에서 지역 경사 계산 -> 내려오는 업스트림 경사를 그것들과 연결

이 과정을 forward와 backward의 API로 생각할 수 있음

forward에서 이 노드의 출력을 계산하는 함수를 구현하고, backward에서 경사를 계산함 

 

아래는 특정 게이트에 대한 구현임

  • forward : x와 y를 입력으로 받아 z값 반환함
  • backward : dz를 입력으로 받음 (업스트림 경사) & 아래로 내려가는 x와 y에 대한 경사인 dx, dy 출력

 

아래는 모든 것이 scalar인 경우

순방향으로 보면 -> forward의 모든 값을 저장하고 있어야 함. 많은 경우 backward가 이걸 사용하기 때문

forward에서 x, y를 저장하고, backward에서 체인 룰을 사용해서 업스트림 경사의 값을 취하고 다른 가지의 값을 곱함

그래서 dx에 대해 저장했던 self.y의 값을 dz로 곱함 (dy에 대해서도 같음)

 

많은 딥러닝 프레임워크와 라이브러리에서 이런 모듈화를 따르고 있음 ex) Caffe

 

Neural Networks

: 신경망은 함수들의 집합(class)로 비선형의 복잡한 함수를 만들기 위해 간단한 함수들을 계층적으로 여러 개 쌓아올리는 형태임

 

이전까지는 linear score function (ex : f = Wx)를 최적화하고자 하는 함수의 예로 사용했음

이제는 이 선형 함수 대신 변형으로 2개의 layer로 된 신경망을 얻을 수 있음

 

위 식은 W1과 x를 행렬 곱셈해서 중간값을 얻고 0과 W의 최대값(max of 0 and W)을 취하는 비선형 함수를 가짐

= 이 선형 layer과 출력과의 최대값

 

이 형태는 비선형성을 가진다는 것이 중요함

비선형성이 없으면 선형 레이어를 다른 레이어 위에 쌓으면 하나의 선형 함수가 될 뿐이기 때문임

그래서 행렬 곱과 선형 레이어를 취해서 여러 개를 쌓는데, 그 사이에 비선형 함수를 넣는 것임 

그 후 score function을 얻고 score의 출력 벡터를 얻을 수 있음

 

linear score function는 가중치 행렬 W와 입력 데이터의 내적을 계산해 각 클래스에 대한 점수를 산출함

이 때 W의 각 행을 특정 클래스에 대한 템플릿으로 생각할 수 있는데, 입력 이미지가 주어졌을 때 신경망은 해당 입력이 이 템플릿과 얼마나 유사한지 계산해 "자동차" 클래스에 대한 점수를 산출함

이때 단일 템플릿만을 사용하면 다양한 스타일의 자동차를 인식하기 어렵다는 단점이 생김

  • ex: 빨간 자동차의 템플릿이 있다면 빨간 자동차는 잘 인식하지만 노란 자동차나 다른 스타일의 자동차는 인식하지 못할 수 있음

=> 현실에서는 여러 스타일과 색상의 자동차가 존재하기 때문에 단일 템플릿만으로는 충분하지 않음

-> 다층 신경망에서는 여러 layer의 가중치 행렬을 사용해 이러한 문제를 해결함

 

다층 신경망

예를 들어, 첫 번째 가중치 행렬 W1은 여전히 여러 템플릿을 포함할 수 있으며, 각 템플릿은 특정한 자동차 스타일(빨간 차, 노란 차 등)을 나타낼 수 있음

그런 다음, hidden layer h에서 이러한 템플릿들에 대한 점수들을 계산한 후, 두 번째 가중치 행렬 W2를 사용하여 이 점수들을 결합하고 조합할 수 있음

-> 다양한 스타일의 자동차를 모두 포함하는 템플릿을 학습할 수 있게 되는 것

-> 따라서, 신경망은 빨간 차뿐만 아니라, 노란 차와 다른 색상의 자동차도 잘 인식할 수 있음

 

 

 

 

 

실제 뉴런과 인공신경망

강의에서는 인공신경망이 인간의 실제 뉴런과 유사하다고 이야기하는 것을 경계하고 있음

실제로 생물학적 뉴런은 종류도 다양하고 훨씬 더 복잡한 연산을 수행하기 때문임

 

 

Activation Function

이 중 현재 가장 많이 사용하는 활성화 함수는 ReLU임

 

 

Neural Networks : Architectures

아래의 왼쪽 그림을 2-layer Neural Net 또는 1-hidden-layer Neural Net이라고 함

기본적으로 weight를 갖고 있는 것만 layer라고 하기 때문에 3-layer가 아니라 2-layer

그래서 input layer는 weight를 가지고 있지 않기 때문에 제외가 됨

  • 오른쪽의 경우도 3-layer neural network 또는 2-hidden-layer Neural Network라고 부름

모든 노드들이 연결되어 있는데, 이런 경우를 Fully-connected layer라고 부르며 줄여서 FC layer라고 함

 

 

Example : feed-forward computation of a Neural Network

layer로 구성하는 이유 = 효율적으로 계산을 할 수 있기 때문

  • 행렬 벡터 연산을 사용해 신경망을 구성하여 이 부분에서 효율적이라 함

위 그림에서 3-layer neural network를 떠올려보면 입력: [3x1] vector

첫 번째 hidden layer의 가중치  [4x3]의 크기 & 모든 노드에 대한 bias는  [4x1] vector에 있음

모든 단일 뉴런에서는 가중치 가 있으므로 행렬 벡터 곱셈 np.dot(W1,x)는 모든 layer에 있는 뉴런의 활성화를 계산함

hidden layer의 는 [4x4] 행렬을, 마지막 output layer에 대한 은 [1x4] 행렬이 됨

=> 이 3-layer 신경망의 forward pass는 activation function과 섞인 3개의 행렬 곱셈이라 볼 수 있음

  • 하나의 layer는 하나의 연산을 통해 계산해 편의성을 제공

 

 


[CS231n 4강 정리] 역전파(Back propagation), 신경망(Neural Network) (tistory.com)

 

[CS231n 4강 정리] 역전파(Back propagation), 신경망(Neural Network)

지난시간까지 w와 스코어, loss function, 그리고 gradient를 배웠습니다. 오늘은 이제 실제로 analytic gradient(앞 강의에서 설명한 해석적 방식) 를 어떻게 계산하는지에 대해서 알아봅시다. 역전파(Back Pr

oculus.tistory.com

cs231n 4강 정리 - Introduction to Neural Networks (velog.io)

 

cs231n 4강 정리 - Introduction to Neural Networks

이번 포스팅은 standford university의 cs231 lecture 4를 공부하고, 강의와 슬라이드를 바탕으로 정리한 글임을 밝힙니다.제가 직접 필기한 이미지 자료는 별도의 허락 없이 복사해서 다른 곳에 게시하는

velog.io

 

 

 

 

 

 

Meta Llama 2

 

Meta Llama 2

Llama 2 was pretrained on publicly available online data sources. The fine-tuned model, Llama Chat, leverages publicly available instruction datasets and over 1 million human annotations.

llama.meta.com


 

Llama : 가장 강력한 오픈 소스 대형 모델이었으나, 오픈 소스 계약으로 인해 상업적 용도로 무료로 사용할 수 없었음

-> 무료 상용 버전으로 출시된 Llama 2

연구용과 상업용으로 사용 가능한 foundation model(LLALA2) & fine-tuned chat 모델(LLAMA2-Chat) 두 가지 버전으로 공개

LLAMA 2 (Foundation Model)

  • LLAMA1의 업데이트 버전
    • pretraining corpus(훈련 데이터) 40% 증가 (1.4T tokens → 2T tokens)
    • Context Length 2배 증가 (2K → 4K)
    • Grouped-query attention 채택
  • Variants: 7B, 13B, 70B (*34B 버전도 개발되었지만, red 팀의 시간 부족으로 인해 릴리즈를 연기 중)

LLAMA 2-CHAT (Fined-tuned chat Model)

  • 대화형 use-cases에 최적화된 fine-tuned 버전
  • Variants: 7B, 13B, 70B

 

LLAMA2 & LLAMA2-Chat의 학습 방법

 

LLAMA2를 공개 데이터셋으로 self-supervised learning한 후 생성

-> LLAMA2를 SFT(Supervised Fine-Tuning)하여 LLAMA2-Chat을 생성

-> LLAMA2-Chat은 RLHF(Reinforcement Learning from Human Feedback)으로 반복적으로 튜닝

 

LLAMA1과 LLAMA2의 차이

 

 

Llama2는 Llama1에 대해 sequence 길이를 더 늘리고 pre-training, fine-tuning, safety 측면에서의 차이만 있기 때문에 위의 내용을 보면 크게 다른 점이 보이지 않음

그 외의 차이로는 Llama2가 GQA (Group Query Attention)을 채택하고 있음

 

GQA

Llama2에 적용된 추론 속도 향상 기술

  • MHA(Multi-Head Attention)과 MQA(Multi-Query Attention)의 장점을 결합한 기술
  • LLM 학습에는 오랜 시간과 많은 자원이 투입되므로 모델을 다 만들어놨는데 GQA를 적용해 다시 학습시키는 것은 큰 부담이 되는데, GQA는 이미 학습된 모델에도 적용할 수 있음

 

  • Multi-head Attention은 H(어텐션 헤드 개수)개의 QKV(Query, Key, Value)를 가짐
    • 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 

sigmoid & tanh는 각각 (0, 1), (-1, 1) 범위이지만 ReLU의 범위는 [0, ∞)

-> 이 점이 gradient vanish를 막아줌 (ReLU의 전성기를 가져온 큰 요인)

이러한 장점을 Swish가 이어받음

-> 모든 양수값을 허용함으로써 정보를 살려감

 

2) Bounded below where 

위의 특성은 너무 큰 음수값은 으로 내보내서 일종의 강한 규제(regularize 효과)를 거는 효과를 유도함

하지만 ReLU에서는 음수값에 대해서는 무조건 을 내보내므로 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)는 항상 (0, 1) 범위의 값을 가지는데, 그 값을 결국 입력 자기자신 가 결정하기 때문에 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을 피하고자 함

이때 유용성과 안정성을 위해 SFT와 RLHF를 모두 사용함

 

 

SFT와 LoRA로 LLAMA2를 fine-tuning 시키는 과정은 아래와 같음

  • LoRA를 이용해 LLAMA2를 finetuning하는 과정 설명하고 있음
  • LoRA : pretrained model의 가중치를 frozen하고, 각 transformer blocks에 trainalble한 layer를 주입

How to fine-tune LLaMA 2 using SFT, LORA (accubits.com)

 

How to fine-tune LLaMA 2 using SFT, LORA

Here, we'll learn how to fine-tune LLaMA2 using two exceptional techniques: SFT (Supervised Fine-Tuning for full parameter) and LORA.

blog.accubits.com

 

RLHF

 

SFT는 많은 LLM에서 채택되고 있는만큼 성능은 확실하나 alignment의 목표를 정확히 포착해 선별하고 관리함에 있어서는 부족할 수 있음

-> 직접 인간이 이에 대해 피드백하고 품질 향상에 이용하는 것이 제시됨. 인간이 피드백함으로 그 선호도 점수에 따라 LLM을 최적화하는 것

 

 

Full model

 

하늘색 block : TransformerBlock으로 구성. attention_norm으로 시작해서 feed_forward로 block 마무리됨

 

Input Tokens

llama2의 dictionary는 약 32000개 정도

모델의 차원은 d_model = 4096

헤드를 32개까지 사용할 수 있음 -> 굉장한 다양성 부여됨

d_k = 4096/32 = 128

모델의 차원과 마찬가지로 input size는 최대 4096개까지 가질 수 있음(Llama1은 2048개)

 

1) Embedding

단어 tokenization

 

2)  RMS Norm - 첫번째 정규화

RMS Norm을 거쳐 Input token size와 d_model의 곱으로 이루어진 Output이 나옴

 

 

3) Rotary Position Embedding

Rotation matrix R(θ)는 d_model * d_model

  • d_model은 모델의 embedding 차원
  • rotation matrix는 임베딩 벡터의 각 차원을 회전시키는 역할

 

Rotation Matrix를 쿼리의 Weight Matrix에 곱해주고 (W_q) 그 다음에 Key의 Weight Matrix에 곱해줌(W_K)

-> 각 토큰 위치에 대해 회전 행렬을 적용해 위치 정보를 통합

위치 정보가 포함된 임베딩 벡터는 W_q, W_k와 곱해져서 Postional Encoded Weight Matrix of Query 와 Position Encoded Weight Matrix of Key가 만들어짐

 

4) Masked Self-Attention

 

 

하늘색 부분 각 R과 W는 곱해서 Positional Encoded Weight Matrix of Query와 Position Encoded Weight Matrix of Key를 구함

-> 여기에 인풋 x_m, x_n을 곱해줌

 

Grouped Multi-Query Attention 과정

attention을 구해야 하는데, 이 때 위에서 구한 grouped multi-query attention을 사용함

  • 여러 헤드를 하나의 그룹으로 묶어 공통의 키(Key)와 값(Value) 행렬을 사용하여 계산 효율성을 높임

Step 1) 쿼리 행렬 계산: 각 헤드별로 개별 쿼리(Query) 행렬을 계산

  • Head_1과 Head_2를 하나의 그룹으로 봤을 때, 거기에 곱해주는 뒤의 Key matrix 는 하나임

Step 2) 키 행렬 공유: 같은 그룹의 헤드들은 동일한 키(Key) 행렬을 사용하여 계산함

Step 3) 어텐션 스코어 계산: 쿼리와 공유된 키 행렬을 곱하고, 스케일 다운 후 소프트맥스를 적용하여 어텐션 스코어를 구함

Step 4) 값 행렬 공유: 같은 그룹의 헤드들은 동일한 값(Value) 행렬을 사용하여 계산된 어텐션 스코어를 곱함

  • 첫 번째 Head_1 에서 Value Matrix 계산 후 마찬가지로 Head_2 에서도 동일한 값 Value Matrix 값을 사용하여 attention score에 곱함

Step 5) 결과 합산: 각 헤드의 결과를 합산하여 최종 어텐션 출력을 만듦

  • 각 헤드마다 attention value matrix가 출력됨

 

 

5) Concatenated Heads Matrix

attention layer를 통해 계산된 각 헤드의 attention value matrix를 concat

concatenated matrix에 weight matrix를 한번 더 곱함

  • weight matrix 크기 : d_model * d_model
  • 헤드들이 다 합해진 것이기에 사이즈가 d_k가 아닌 d_model임
  • output은 (input token size) * (d_model) 

 

 

6) RMS Normalization - 두 번째

위에서 output으로 나온 output of grouped query attention과 초반의 embedding layer의 output을 더한 후 두 번째 RMS Norm으로 들어감

 

 

 

 

7) SwiGLU FeedForward

F1 : 컴퓨팅 타임을 줄여주기 위해 가중치 행렬 을 사용하여 입력 차원을 늘림

  • d_ffnn : 사용자가 결정할 하이퍼 파라미터
  • 모델이 입력의 상황 정보를 이해하고 의미 있는 토큰 표현을 생성할 수 있도록 도움 

F2 : F1 아웃풋에 SwiGLU를 적용.

  • SwiGLU의 non linear 특성이 반영되면서 차원은 이전과 똑같음 

F3 : 가중치 행렬 를 사용하여 입력의 차원을 원래 모양으로 줄

 

 

 

 

 

 

8) RMS Norm - 세 번째

앞의 RMS Norm의 결과값과 FFNN(SwiGLU)의 결과 값을더해 정규화함

 

 

9) Linearization

linear layer를 통해 input (앞의 결과)의 차원을 vocab set의 사이즈만큼 키움

  • weight matrix에서 차원을 vocab size로 맞춰주고 곱함

 

 

10) SoftMax (Classification Probability)

최종적으로 softmax를 적용하면 각 vocab마다의 어떤 확률이 나옴

 

 

 

 


Llama 2: Open Foundation and Fine-Tuned Chat Models (velog.io)

 

Llama 2: Open Foundation and Fine-Tuned Chat Models

마지막 주차 논문 리뷰

velog.io

라마2에 적용된 추론 속도 향상 기술인 GQA(Grouped Query Attention)에 대해 (sk.com)

 

라마2에 적용된 추론 속도 향상 기술인 GQA(Grouped Query Attention)에 대해

 

devocean.sk.com

[ Llama 2 ] analyze model and review code. (velog.io)

 

[ Llama 2 ] analyze model and review code.

Llama 2 : analyze model and review code.

velog.io