no image
[boostcamp] 부스트캠프 AI Tech 23주차 돌아보기
1. 잘한 것Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.Audio-Language Model, LLM Knowledge Distillation에 관한 논문을 읽고 정리했습니다.ONNX에 대한 내용을 찾아보면서 파이토치 모델의 변환을 시도하고 있습니다. 2. 부족한 것fairseq에 대한 지식 부족으로 EAT 인코더 실험을 진행하지 못했습니다.현재 적용하고 있는 모델에서는 ONNX로 변환이 쉽지 않아 제대로 변환을 수행하진 못했습니다.Knowledge Distillation을 해보려고 했지만, 여기에 적용할만한 적절한 방법론을 찾지 못했습니다.3. 배운 것LoRA Config를 활용하면 데이터 타입 32비트로 적용ONNX라는 프레임워크가 딥러닝 모델의 효율성을 높이고, 배..
2025.02.07
no image
[boostcamp] 부스트캠프 AI Tech 22주차 돌아보기
1. 잘한 것Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.SQL 공부 및 정리를 완료했습니다.여러 LLM backbone에 대해 실험을 진행했습니다.여러 Adapter에 대해 실험을 진행했습니다. 2. 부족한 것LLM 실험을 진행했지만, 훈련에 적은 epoch만 할애했기 때문에 좋지 못한 성능을 보였습니다.LLM 모델 중 Adapter 실험 중 제대로 동작하지 않는 것3. 배운 것LoRA에서 개선된 방식들(VB-LoRA 등)이 있는데, 유명한 LoRA보다 더 경량화가 진행되는 것으로 보입니다. (Inference Time 기준 약 20% 감소) 다른 LLM에 Adapter를 적용하기 위해서는 target modules를 정의해야 하는데, LLM마다 PEFT 진행을 위해 모..
2025.01.24
[알고리즘] 파이썬으로 이진 탐색(Binary Search) 구현하기
이진 탐색(혹은 이분 탐색)은 정렬된 배열에서 특정한 값을 찾는 알고리즘이다. 탐색 범위를 절반씩 줄여가며 빠르게 원하는 값을 찾아낼 수 있어 효율적이다. 이진 탐색의 기본적인 원리는 다음과 같다.이분 탐색을 위해 오름차순 또는 내림차순으로 정렬된 배열을 준비탐색 범위의 중간에 있는 값을 찾아서, 찾고자 하는 값과 비교비교에서 범위를 좁힌다. (오름차순 기준) 3-1. 중간값이 찾고자 하는 값보다 크면 탐색 범위를 왼쪽 절반으로 좁힌다. 3-2. 중간값이 찾고자 하는 값보다 작으면 탐색 범위를 오른쪽 절반으로 좁힌다.3의 과정을 원하는 값을 찾을 때까지 반복 위 과정을 하나의 함수로 정리하면 다음과 같다.def binary_search(arr, target): left = 0 right = l..
2025.01.21
SQL 함수로 결과에 순위 부여하기 | ROW_NUMBER, RANK, DENSE_RANK, NTILE
ROW_NUMBERROW_NUMBER는 모든 행에 유일값으로 순위를 부여한다. 조건에 따라 같은 순위에 놓일 수 있는 경우에는 정렬 순서에 따라 순위를 부여한다. 기본적인 사용 방법은 다음과 같다. PARTITION BY는 그룹별로 묶어주는 역할을 수행하며, ORDER BY로 순서도 부여할 수 있다. (물론 이 기능들을 사용하지 않을 수 있다.)ROW_NUMBER() OVER (PARTITION BY 열 ORDER BY 열)RANKRANK는 ROW_NUMBER와 유사하지만, 같은 순위를 같은 값을 부여한다. 그리고 그 다음 순위에 대해서는 같은 순위의 개수만큼 더해서 순위를 매긴다. 예를 들면, 공동 3순위가 3개가 존재하면 그 다음 순위는 6순위가 부여된다. 기본적인 사용 방법은 다음과 같다.RANK(..
2025.01.20
SQL
no image
[boostcamp] 부스트캠프 AI Tech 21주차 돌아보기
1. 잘한 것Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.SQL 공부 및 정리를 지속하고 있습니다.SALMONN 논문 리뷰를 진행하고, 관련 내용을 공유했습니다. 프로젝트 베이스라인을 정리했습니다. 2. 부족한 것지난 주에 '시도할 것'으로 내세웠던 것을 이행하지 못했습니다.코드 이해 부족, 데이터 업로드 지연 등의 이유로 제대로 베이스라인을 돌려보지 못했습니다.처음 보는 팀원도 베이스라인을 보고 잘 이해할 수 있도록 문서화하고 싶었지만, 코드 이해 부족 및 프로젝트 크기가 생각보다 커서 제대로 수행하지 못했습니다.3. 배운 것📖 SALMONN 모델의 구조 및 동작 방식 4. 시도할 것베이스라인 실행을 통한 SALMONN 학습 방법론 익숙해지려고 합니다.LLM 모듈을 바..
2025.01.17
SQL 집계함수 응용 사례 정리하기 | 고유값 집계, 그룹별 집계, 부분합
집계함수의 경우 보다 직관적이라 기본적인 내용들보다는 실질적으로 활용할 수 있는 사례나 잘 몰랐던 내용 위주로 정리하였다.고유값 데이터 개수 세기COUNT와 DISTINCT 문을 조합하면 NULL 값이 아닌 고유값의 데이터 개수를 구할 수 있다. 아래는 활용 예시이다.SELECT COUNT(DISTINCT Country) FROM Customers;그룹별 집계하기GROUP BY와 조합하면 그룹별 합계, 평균, 최대, 최소 등을 구할 수 있다. 아래 예시는 sector로 그룹화해서 종가(close_price)의 합계, 평균, 최대 및 최소를 구하는 방법이다.SELECT sector, SUM(close_price), AVG(close_price), MAX(close_price), MIN(close_price..
2025.01.17
SQL
SQL 기본 날짜 함수 정리하기 | 날짜 정보 가져오기, 날짜 연산, 날짜 시간 형식 지정
날짜 정보 가져오기서버의 현재 날짜, 시간 반환하기현재 접속 중인 데이터베이스 서버의 시간을 확인하려면, SYSDATE를 사용할 수 있다. ("YYYY-MM-DD HH:MM:SS" 로 반환)SELECT SYSDATE();날짜의 개별 정보 가져오기날짜 형식의 일, 월, 연에 대한 정보를 가져오려면 직관적으로 DAY, MONTH, YEAR 함수를 사용할 수 있다. 사용법은 아래와 같다.SELECT DAY("2017-06-15");SELECT MONTH("2017-06-15");SELECT YEAR("2017-06-15");날짜 연산날짜 더하기날짜를 더하거나 빼려면 DATE_ADD를 사용한다. 다음은 주어진 날짜로부터 10일을 더한 것을 반환하는 예시이다.SELECT DATE_ADD("2017-06-15", ..
2025.01.16
SQL
SQL 기본 문자열 함수 정리하기
문자열 연결문자열과 문자열 연결문자열끼리 연결할 때는 단순히 +로 연결할 수도 있지만, CONCAT 함수를 사용할 수 있다. 다음은 몇몇 문자열을 한번에 연결한 예시이다.SELECT CONCAT("SQL ", "Tutorial ", "is ", "fun!") AS ConcatenatedString;만약 3개의 열을 하나의 열로 합치고 싶다면 아래 예제처럼 활용할 수 있다.SELECT CONCAT(Address, " ", PostalCode, " ", City) AS AddressFROM Customers;데이터 형 변환문자열과 다른 데이터형 연결문자열이 아닌 다른 데이터형의 값과 연결해야 할 경우는 어떻게 할 수 있을까? 다른 프로그래밍 언어처럼 변환하여 연결해주면 되는데, CAST와 CONVERT를 활..
2025.01.15
SQL
no image
[Review] SALMONN (오디오 - 언어 모델) 논문 리뷰
Introduction최근 LLM 연구는 언어가 아닌 다른 입력을 넣어 인체의 다른 감각적 양상(modality)을 불어넣는 방향으로 이뤄진다. 이를 통해 AI가 여러 형태의 데이터를 입력으로 이해하고 연산 값을 출력할 수 있게 된다. 이러한 방식은 Multi-modal (멀티모달)이라 불리며 연결 모듈이나 LLM 어댑터를 통해 훈련이 가능하다. 다만, 이러한 방식에는 특정 작업에 제한되는 문제가 발생한다. 특정 작업에는 잘 작동되지만 범용적으로 사용되기가 제한되는데, 이를 task over-fitting이라 하며 AI의 사용 가능성을 제한하는 요소가 된다. 따라서 많은 문제를 해결하는 AI 적용을 위해서는 훈련을 통해 학습한 것이 아닌 것을 해결하는 것이 필요한데, 이를 emergent ability라..
2025.01.13
반응형

1. 잘한 것

  • Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.
  • Audio-Language Model, LLM Knowledge Distillation에 관한 논문을 읽고 정리했습니다.
  • ONNX에 대한 내용을 찾아보면서 파이토치 모델의 변환을 시도하고 있습니다.

2. 부족한 것

  • fairseq에 대한 지식 부족으로 EAT 인코더 실험을 진행하지 못했습니다.
  • 현재 적용하고 있는 모델에서는 ONNX로 변환이 쉽지 않아 제대로 변환을 수행하진 못했습니다.
  • Knowledge Distillation을 해보려고 했지만, 여기에 적용할만한 적절한 방법론을 찾지 못했습니다.

3. 배운 것

  • LoRA Config를 활용하면 데이터 타입 32비트로 적용
  • ONNX라는 프레임워크가 딥러닝 모델의 효율성을 높이고, 배포를 위해 필요

4. 시도할 것

  • 컴포넌트별 ONNX 변환 시도
  • 부스트캠프에서 수행했던 내용들을 정리
  • 정리한 내용들을 바탕으로 기업 지원
반응형
반응형

1. 잘한 것

  • Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.
  • SQL 공부 및 정리를 완료했습니다.
  • 여러 LLM backbone에 대해 실험을 진행했습니다.
  • 여러 Adapter에 대해 실험을 진행했습니다.

2. 부족한 것

  • LLM 실험을 진행했지만, 훈련에 적은 epoch만 할애했기 때문에 좋지 못한 성능을 보였습니다.
  • LLM 모델 중
  • Adapter 실험 중 제대로 동작하지 않는 것

3. 배운 것

  • LoRA에서 개선된 방식들(VB-LoRA 등)이 있는데, 유명한 LoRA보다 더 경량화가 진행되는 것으로 보입니다. (Inference Time 기준 약 20% 감소)
  • 다른 LLM에 Adapter를 적용하기 위해서는 target modules를 정의해야 하는데, LLM마다 PEFT 진행을 위해 모델 구조를 알아야 합니다.

4. 시도할 것

  • AAC 분야 가장 좋은 성능을 보인 최신 모델인 SLAM-AAC의 인코더를 활용해볼 예정입니다.
  • 잘못 생성된 텍스트를 LLM으로 후처리할 수 있는 방법에 대해 탐구해볼 예정입니다.
  • Knowledge Distillation으로 더 효율적인 학습과 경량화가 가능할지 방법을 찾아보고 시도해볼 예정입니다.
반응형
반응형

이진 탐색(혹은 이분 탐색)은 정렬된 배열에서 특정한 값을 찾는 알고리즘이다. 탐색 범위를 절반씩 줄여가며 빠르게 원하는 값을 찾아낼 수 있어 효율적이다. 이진 탐색의 기본적인 원리는 다음과 같다.


  1. 이분 탐색을 위해 오름차순 또는 내림차순으로 정렬된 배열을 준비
  2. 탐색 범위의 중간에 있는 값을 찾아서, 찾고자 하는 값과 비교
  3. 비교에서 범위를 좁힌다. (오름차순 기준)
    3-1. 중간값이 찾고자 하는 값보다 크면 탐색 범위를 왼쪽 절반으로 좁힌다.
    3-2. 중간값이 찾고자 하는 값보다 작으면 탐색 범위를 오른쪽 절반으로 좁힌다.
  4. 3의 과정을 원하는 값을 찾을 때까지 반복

위 과정을 하나의 함수로 정리하면 다음과 같다.

def binary_search(arr, target):
    left = 0
    right = len(arr) - 1

    while left <= right:
        mid = (left + right) // 2

        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1

    return -1  # 존재하지 않는 경우
반응형
반응형

ROW_NUMBER

ROW_NUMBER는 모든 행에 유일값으로 순위를 부여한다. 조건에 따라 같은 순위에 놓일 수 있는 경우에는 정렬 순서에 따라 순위를 부여한다. 기본적인 사용 방법은 다음과 같다. PARTITION BY는 그룹별로 묶어주는 역할을 수행하며, ORDER BY로 순서도 부여할 수 있다. (물론 이 기능들을 사용하지 않을 수 있다.)

ROW_NUMBER() OVER (PARTITION BY 열 ORDER BY 열)

RANK

RANK는 ROW_NUMBER와 유사하지만, 같은 순위를 같은 값을 부여한다. 그리고 그 다음 순위에 대해서는 같은 순위의 개수만큼 더해서 순위를 매긴다. 예를 들면, 공동 3순위가 3개가 존재하면 그 다음 순위는 6순위가 부여된다. 기본적인 사용 방법은 다음과 같다.

RANK() OVER (PARTITION BY 열 ORDER BY 열)

DENSE_RANK

RANK에서 같은 순위에 대해서 개수를 고려했지만, 개수를 고려하고 싶지 않다면 DENSE_RANK를 사용하면 된다. 기본적인 사용 방법은 다음과 같다.

DENSE_RANK() OVER (PARTITION BY 열 ORDER BY 열)

NTILE

지정한 값만큼 데이터 행을 그룹화해 그룹별 순위를 매기고 싶다면 NTILE을 사용한다. 기본적인 사용 방법은 다음과 같다.

NTILE(정수 숫자) OVER (PARTITION BY 열 ORDER BY 열)

PERCENT_RANK

앞서 순위 계산하는 여러 방법(ROW_NUMBER, RANK 등)을 공유하였다. 여기서는 상대 순위를 계산하기 위해 PERCENT_RANK를 사용하였다. 기본적인 사용법은 다음과 같다.

PERCENT_RANK() OVER (PARTITION BY 열 ORDER BY 열)

참고자료

  1. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
반응형
반응형

1. 잘한 것

  • Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.
  • SQL 공부 및 정리를 지속하고 있습니다.
  • SALMONN 논문 리뷰를 진행하고, 관련 내용을 공유했습니다.
  • 프로젝트 베이스라인을 정리했습니다.

2. 부족한 것

  • 지난 주에 '시도할 것'으로 내세웠던 것을 이행하지 못했습니다.
  • 코드 이해 부족, 데이터 업로드 지연 등의 이유로 제대로 베이스라인을 돌려보지 못했습니다.
  • 처음 보는 팀원도 베이스라인을 보고 잘 이해할 수 있도록 문서화하고 싶었지만, 코드 이해 부족 및 프로젝트 크기가 생각보다 커서 제대로 수행하지 못했습니다.

3. 배운 것

📖 SALMONN 모델의 구조 및 동작 방식

4. 시도할 것

  • 베이스라인 실행을 통한 SALMONN 학습 방법론 익숙해지려고 합니다.
  • LLM 모듈을 바꿔서 실험을 진행해볼 계획입니다.
  • Visual Language Model에 대해 살펴보고 구조를 개선할 수 있을지 검토할 계획입니다.
반응형
반응형

집계함수의 경우 보다 직관적이라 기본적인 내용들보다는 실질적으로 활용할 수 있는 사례나 잘 몰랐던 내용 위주로 정리하였다.

고유값 데이터 개수 세기

COUNT와 DISTINCT 문을 조합하면 NULL 값이 아닌 고유값의 데이터 개수를 구할 수 있다. 아래는 활용 예시이다.

SELECT COUNT(DISTINCT Country) FROM Customers;

그룹별 집계하기

GROUP BY와 조합하면 그룹별 합계, 평균, 최대, 최소 등을 구할 수 있다. 아래 예시는 sector로 그룹화해서 종가(close_price)의 합계, 평균, 최대 및 최소를 구하는 방법이다.

SELECT sector, SUM(close_price), AVG(close_price), MAX(close_price), MIN(close_price) 
FROM nasdaq
GROUP BY sector

부분합 구하기

부분합을 구하려면 GROUP BY와 ROLLUP를 조합한다. 아래는 모든 연도 값에 대한 총계를 보여주는 부분합을 보여주는 쿼리이다.

SELECT year, SUM(profit) AS profit
FROM sales
GROUP BY year WITH ROLLUP;
반응형
반응형

날짜 정보 가져오기

서버의 현재 날짜, 시간 반환하기

현재 접속 중인 데이터베이스 서버의 시간을 확인하려면, SYSDATE를 사용할 수 있다. ("YYYY-MM-DD HH:MM:SS" 로 반환)

SELECT SYSDATE();

날짜의 개별 정보 가져오기

날짜 형식의 일, 월, 연에 대한 정보를 가져오려면 직관적으로 DAY, MONTH, YEAR 함수를 사용할 수 있다. 사용법은 아래와 같다.

SELECT DAY("2017-06-15");
SELECT MONTH("2017-06-15");
SELECT YEAR("2017-06-15");

날짜 연산

날짜 더하기

날짜를 더하거나 빼려면 DATE_ADD를 사용한다. 다음은 주어진 날짜로부터 10일을 더한 것을 반환하는 예시이다.

SELECT DATE_ADD("2017-06-15", INTERVAL 10 DAY)

여기서 단위는 아래의 것들이 사용가능하다. (더 다양하지만, 기본적인 것들만 정리)

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • WEEK
  • QUARTER
  • YEAR

날짜 차이 구하기

만약 두 날짜 간 차이를 구하려면 DATEDIFF를 사용할 수 있다. 사용법은 다음과 같다.

SELECT DATEDIFF("2017-06-25", "2017-06-15");

시간, 날짜 자료형 지정하기

시간 자료형

시간 자료형을 지정하기 위해서는 TIME_FORMAT을 사용할 수 있다. 주요한 포맷은 다음과 같다.

Format Description
%H 시간 (00~23)
%h 시간 (00~12)
%i 분 (00~59)
%p AM 또는 PM
%r hh:mm:ss AM/PM
%T hh:mm:ss

아래는 한 예시이다. (결과 : 07 30 10 PM)

SELECT TIME_FORMAT("19:30:10", "%h %i %s %p");

날짜 자료형

날짜 자료형을 지정하기 위해서는 DATE_FORMAT을 사용할 수 있다. 몇 개의 사례를 살펴보면서 익숙해지자. 연도는 네자리, 월은 영문으로, 일은 숫자로 나타내는 쿼리이다. (결과는 June 15 2017)

SELECT DATE_FORMAT("2017-06-15", "%M %d %Y");

만약 영문으로 전체 요일까지 표시하고 싶다면 아래와 같이 적용이 가능하다. (결과는 Thursday June 15 2017)

SELECT DATE_FORMAT("2017-06-15", "%W %M %d %Y");

참고자료

  1. W3 School
  2. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
반응형
반응형

문자열 연결

문자열과 문자열 연결

문자열끼리 연결할 때는 단순히 +로 연결할 수도 있지만, CONCAT 함수를 사용할 수 있다. 다음은 몇몇 문자열을 한번에 연결한 예시이다.

SELECT CONCAT("SQL ", "Tutorial ", "is ", "fun!") AS ConcatenatedString;

만약 3개의 열을 하나의 열로 합치고 싶다면 아래 예제처럼 활용할 수 있다.

SELECT CONCAT(Address, " ", PostalCode, " ", City) AS Address
FROM Customers;

데이터 형 변환

문자열과 다른 데이터형 연결

문자열이 아닌 다른 데이터형의 값과 연결해야 할 경우는 어떻게 할 수 있을까? 다른 프로그래밍 언어처럼 변환하여 연결해주면 되는데, CAST와 CONVERT를 활용하면 된다. CAST 함수의 사용법은 다음과 같다.

CAST(value AS datatype)

-- Example

SELECT CAST("2017-08-29" AS DATE);

CONVERT() 함수는 특정 값을 데이터타입이나 문자열의 집합으로 바꿔준다. 아래는 사용법 예시이다.

CONVERT(value, type)

-- Or

CONVERT(value USING charset)

-- Example

SELECT CONVERT(150, CHAR);

NULL 처리하기

특정 데이터형이 아닌 NULL과 연결하려고 하면, ISNULL로 대체할 값을 만든 후 반환한다. 다음은 ISNULL의 사용법이다. 만약 NULL 값이 있는 경우 공백으로 반환할 수 있다.

ISNULL(column, expression)   

-- Example
SELECT ISNULL(col_a, "");

만약 여러 열에 대해서 NULL을 체크하고 대입하고 싶다면, COALESCE 함수를 사용할 수 있다. 여러 개의 데이터 리스트를 넣고 그 중에 가장 첫번째로 NULL이 아닌 것을 입력한다. 사용법은 아래와 같이 넣어줄 수 있다.

COALESCE(val1, val2, ...., val_n)

문자열 처리

소문자, 대문자 변경

소문자와 대문자를 구분하는 경우도 있지만, 구분이 필요하지 않을 수도 있다. 이때 LOWER와 UPPER를 사용하면 된다.

SELECT LOWER("SQL Tutorial is FUN!");
SELECT UPPER("SQL Tutorial is FUN!");

문자열 공백 제거

문자열 특성상 공백이 입력되는 경우가 있다. 이 경우 TRIM을 활용하면 되는데, 다른 프로그래밍 언어처럼 왼쪽, 오른쪽에 대해서도 적용할 수 있는 LTRIM, RTRIM도 존재한다. 어떤 공백을 제거하는지 살펴보기 위해 아래 예제를 참고하면 된다.

SELECT TRIM('    SQL Tutorial    ') AS TrimmedString;
SELECT RTRIM("SQL Tutorial     ") AS RightTrimmedString;
SELECT LTRIM("     SQL Tutorial") AS LeftTrimmedString;

지정한 길이만큼 반환

앞서 TRIM처럼 왼쪽이나 오른쪽에서 지정한 길이만큼 반환하는 함수가 LEFT, RIGHT가 있다. 사용법은 아래와 같다.

RIGHT(string, number_of_chars)
LEFT(string, number_of_chars)

만약 지정한 범위의 문자열을 반환하려면 SUBSTRING을 활용할 수 있다. string부터 시작 숫자를 그리고 반환할 문자 개수를 적어서 사용한다.

SUBSTRING(string, start, length)

--OR

SUBSTRING(string FROM start FOR length)

문자 바꾸기

기존 문자에서 특정 문자(substring)를 새로운 문자(new_string)으로 바꾸기 위해서는 아래와 같이 REPLACE를 쓰면 된다.

REPLACE(string, substring, new_string)

반복하기

특정 문자를 반복하려면 REPEAT을 사용하면 된다.

REPEAT(string, number)

만약 공백을 반복하고 싶다면, SPACE를 활용한다.

SPACE(number)

역순

만약 문자열을 거꾸로 정렬하기 위해서는 REVERSE를 활용한다.

REVERSE(string)

참고자료

  1. W3Schools
  2. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
반응형
반응형

Introduction

최근 LLM 연구는 언어가 아닌 다른 입력을 넣어 인체의 다른 감각적 양상(modality)을 불어넣는 방향으로 이뤄진다. 이를 통해 AI가 여러 형태의 데이터를 입력으로 이해하고 연산 값을 출력할 수 있게 된다. 이러한 방식은 Multi-modal (멀티모달)이라 불리며 연결 모듈이나 LLM 어댑터를 통해 훈련이 가능하다.

 

다만, 이러한 방식에는 특정 작업에 제한되는 문제가 발생한다. 특정 작업에는 잘 작동되지만 범용적으로 사용되기가 제한되는데, 이를 task over-fitting이라 하며 AI의 사용 가능성을 제한하는 요소가 된다. 따라서 많은 문제를 해결하는 AI 적용을 위해서는 훈련을 통해 학습한 것이 아닌 것을 해결하는 것이 필요한데, 이를 emergent ability라고 한다.

 

SALMONN(Speech Audio Language Music Open Neural Network)은 사전학습된 LLM과 오디오 인코더를 통합한 멀티모달 모델이다. LLM이 오디오 입력을 이해하고 처리하도록 도와주면서 새로운 능력인 emergent ability를 나타낼 수 있도록 훈련 방법을 고안했다. 논문에 따르면, 일반적인 오디오 - 텍스트 문제를 해결할 수 있는 최초로 시도된 모델이라고 한다. [각주:1]

SALMONN [1]



Structure

SALMONN은 크게 다음과 같은 요소들로 구성된다.

 

  • 오디오 입력 데이터를 처리하는 인코더
  • 인코더 출력값을 LLM에 입력할 수 있도록 토큰 변환
  • LLM을 통한 출력

 

각 구성 요소별로 아래에서 살펴보자.

 

Dual Auditory Encoders

먼저 음성 데이터를 처리가능하게끔 인코딩해야 하는데, SALMONN에서는 두 개의 인코더(Whisper, BEATs)로 구성된다. 두 개를 도입한 이유는 일반적인 오디오 데이터를 처리하기 위해 스피치와 스피치가 아닌 오디오를 처리할 수 있는 두 종류의 인코더를 활용한다. 인코더는 음성 데이터를 인코딩하는 역할로 직접적인 학습을 수행하지 않는다.

 

Whisper는 스피치 인식 및 번역을 위해 학습된 모델이고, BEATs는 스피치가 아닌 오디오 정보 추출을 가능하도록 학습된 모델이다. 스피치와 다르게 Mel spectogram 을 입력으로 받아 처리를 하게 된다. 두 인코더의 출력은 50 Hz로 동일하기 때문에 총 T개의 프레임으로 합쳐(concatenate)준다.

 

Window-level Q-Former

합쳐진 인코더 출력을 LLM에 입력하기 위한 토큰으로 변환하기 위해 Q-Former를 활용한다. Q-Former는 이미지 인코딩에서 텍스트와 관련된 정보를 추출하고 LLM에 의해 해석 가능하도록 훈련된다. [각주:2] 

 

T개의 인코더 출력 이미지를 N개의 고정된 숫자 쿼리로 변환한다. 여기서 음성은 가변적인 크기를 갖기 때문에 L 크기의 윈도우로 분할하게 되고, 마지막 윈도우는 제로 패딩 처리를 한다. 이를 식으로 나타내면 아래와 같다.

 

LLM & LoRA

SALMONN에서는 LLaMA에서 파생된 언어모델 중 하나인 Vicuna를 활용한다. 그리고 파라미터 효율적인 학습을 위해 LoRA 기법을 활용한다.



Training & Evaluation

Training

먼저, 음성 인식 및 오디오 캡션 생성 데이터로 Q-Former와 LoRA를 사전학습한다. 그리고 본격적인 훈련을 위해 Audio-Text Instruction 쌍으로 구성된 학습을 수행한다. (이를 Instruction Tuning으로 지칭한다) 마지막으로 더 길고 다양한 응답을 생성하기 위해 Zero-shot Instruction(Activation Tuning) 훈련을 진행한다. 이 논문에서 제안한 방법은 스토리텔링이나 질의응답 데이터로 추가 학습을 진행하거나, LoRA의 Scaling factor를 감소시키는 방법이 있다.

 

Evaluation

해당 논문에서는 일반적인 오디오 문제 해결을 평가하기 위해 총 3가지 레벨로 구분한 평가를 제안한다. 우선 Instruction Tuning에서 학습한 문제들을 평가한다. 두번째는 훈련하지 않은 일반적인 NLP 문제들(예를 들어, 키워드 추출, 질의응답, 번역 등)을 평가한다. 마지막으로 좀 더 일반적인 해결 능력을 평가하기 위해 오디오 기반 스토리텔링, 스피치-오디오 추론 등 어려운 작업으로 구성한다.



결론

SALMONN은 일반적인 오디오 문제(Generic hearing)를 처리할 수 있는 모델로 구조를 제안했을 뿐 아니라, 이를 훈련하고 평가하는 방법까지 제안하였다. 특히, 여기서 제안한 Activiation Tuning은 emergent abilities를 갖기 위해서 필요했고, 단순히 LoRA scaling factor를 줄이는 방법만으로도 성능 향상이 나타나는 것을 확인했다.

 

👆 PPT로 살펴보기 

 

참고자료

반응형