SQL 여러 쿼리 연결하기 | UNION, INTERSECT, EXCEPT
UNIONUNION은 두개 이상의 쿼리 결과를 결합하는데 사용된다. 모든 SELECT문은 같은 숫자의 열을 가져야 하고, 유사한 데이터 형식이어야 하며, 같은 순서로 열이 구성되어야 한다. 기본적인 형식은 다음과 같다.SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2;UNION은 기본적으로 중복을 제거한다. 만약 중복된 것까지 포함하고 싶다면 UNION ALL을 사용하자.SELECT column_name(s) FROM table1UNION ALLSELECT column_name(s) FROM table2;INTERSECTINTERSECT는 이름처럼 교집합이기 때문에 INNER JOIN과 유사하나, 각 쿼리에서 반환한 결과에서 ..
2025.01.12
SQL
공통 테이블식 쿼리(CTE) 기본 내용 정리하기 | 일반 & 재귀 CTE
공통 테이블 식(Common Table Expression, CTE)은 데이터베이스에 없는 테이블이 필요할 때 사용한다. CTE는 크게 일반 CTE와 재귀 CTE로 나뉜다. 일반 CTE일반 CTE는 여러 쿼리들을 결합할 때 사용할 수 있다. 기본적인 형식은 다음과 같다. WITH [CTE 테이블] (열1, 열2 ...)AS( )SELECT [열 이름] FROM [CTE_테이블]위 쿼리는 AS 안에 있는 SELECT문으로 반환하는 열을 가지고 CTE 테이블을 정의한다. 만약 가져오는 SELECT문과 CTE 테이블의 열 개수가 다르면 오류가 반환된다.재귀 CTE재귀 CTE는 CTE 결과를 CTE 내부 쿼리에서 재사용하는 구조이다. 이는 주로 계층이나 그래프 형태의 데이터를 검색할 때 많이 사용한다고 한..
2025.01.11
SQL
SQL 서브 쿼리 사용하기 | IN, ANY, ALL, EXISTS
서브쿼리(subquery)는 쿼리 안에 포함되는 또 다른 쿼리이다. 조인하지 않고 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 수 있다. 서브쿼리의 주요 특징은 다음과 같다.- 반드시 소괄호로 감싸 사용- 주 쿼리를 실행하기 전에 1번만 실행- 비교 연산자에 서브쿼리를 사용하는 경우 서브쿼리를 오른쪽에 기술- 내부에는 ORDER BY 사용 불가WHERE 서브쿼리WHERE문에 사용하는 서브 쿼리를 중첩 서브쿼리(nested subquery)라고도 한다. 이를 조건문의 일부로 사용할 수 있다. 단일 행서브쿼리의 결과가 1행만 반환되는 경우이다. 다음은 쿼리 기본 형식이다.SELECT [열 이름]FROM [테이블]WHERE [열] = (SELECT [열] FROM [테이블] WHERE [조건..
2025.01.10
SQL
no image
[boostcamp] 부스트캠프 AI Tech 20주차 돌아보기
1. 잘한 것Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.SQL 공부 및 정리를 지속하고 있습니다.수업 및 과제를 제시간에 마무리했습니다.2. 부족한 것디퓨전 모델에 대한 이론적 지식 및 구현에 대해 충분히 이해하지 못했습니다.과제의 결과물 퀄리티가 많이 떨어집니다..3. 배운 것📖 오디오 처리 라이브러리(librosa, torchaudio)📖 오디오 데이터 처리 개요📖 이미지 생성 관련 최신 트렌드 정리4. 시도할 것이력서 피드백이 온 것을 바탕으로 수정을 해서 제출할 계획입니다.Transformer에 대한 추가적인 이해가 필요할 것으로 보여
2025.01.09
no image
SQL로 서로 다른 테이블 조합(JOIN)하기 | INNER JOIN, OUTER JOIN, CROSS JOIN, SELF JOIN
INNER JOIN내부 조인(Inner Join)은 키에 해당하는 각 테이블의 열 값을 비교해 조건에 맞는 값을 검색한다. 기초 교육 과정에서 배운 집합의 관점에서 살펴본다면, 두개의 서로 다른 집합(테이블)의 교집합이라고 생각할 수 있다. 다음은 내부 조인의 기본 형식이다.SELECT [열]FROM [테이블1]INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]WHERE [검색 조건] 여기서 ON문은 조인 조건으로 활용된다. WHERE와의 차이점은 ON은 조인을 수행할 때 조건으로 사용되는 것이고, WHERE는 조인을 완료한 상태에서 데이터를 조회할 때 사용한다. 만약 서로 다른 3개 이상의 테이블을 조인한다면 아래처럼 INNER JOIN을 추가하는 방식으로 가능하다.SELECT [..
2025.01.09
SQL
[CV] 이미지 생성 관련 트렌드 기본 정리 | 2023~204년 상반기까지
기본 디퓨전 모델여기서 기본 디퓨전 모델은 별도의 조건이 주어지지 않고, 이미지를 생성하는 모델을 말한다.DDPM (Denoising Diffusion Probabilistic Model)DDPM은 점진적인 노이즈 추가와 제거 과정을 통해 이미지를 생성한다. 이는 마르코프 체인 기반의 확률적 모델링을 활용한다. 순전파에서는 원본 이미지에 점진적으로 가우시안 노이즈를 추가하고, 역전파에서는 노이즈를 단계적으로 제거하면서 이미지를 복원한다. 이러한 훈련은 U-Net 구조에서 이뤄진다.Improved DDPMDDPM에서 노이즈 스케줄링, 가우시안 전이 모델링, 목적함수를 개선하여 나온 모델이다. 이를 통해 샘플링 속도와 학습 효율성을 개선할 수 있었다.Latent Diffusion Models (LDM)LDM..
2025.01.08
SQL로 테이블 생성 및 조작하기 정리 | CREATE, INSERT, UPDATE, DELETE
데이터베이스 다루기SELECT, INSERT, UPDATE, DELETE 등 데이터 조작 언어(Data Manipulation Language, DML)는 테이블을 대상으로 한다. 따라서 이러한 구문을 사용하기 위한 테이블을 생성(CREATE), 변경(ALTER), 삭제(DROP)하는 기능이 필요한데, 이를 데이터 정의 언어(Data Definition Language)라고 한다. 데이터베이스 생성 및 삭제데이터베이스 생성하기 위한 기본 형식은 다음과 같다.CREATE DATABASE [데이터베이스 이름]데이터베이스를 삭제하기 위한 기본 형식은 다음과 같다.DROP DATABASE [데이터베이스 이름]테이블 다루기테이블은 데이터베이스의 내부에 있는 개념으로 다루기 위해서는 데이터베이스를 먼저 선택해야 한..
2025.01.06
SQL
SQL로 데이터 그룹화하기 | GROUP BY, HAVING, DISTINCT
그룹화하기엑셀의 피벗 테이블처럼 데이터를 그룹화하고, 필터링 하는 기능은 GROUP BY와 HAVING을 통해 구현할 수 있다. 아래는 기본 형식이다.SELECT [열] FROM [테이블]WHERE [열] = [조건값]GROUP BY [열]HAVING [열] = [조건값]여기서 GROUP BY로 열은 여러개를 지정할 수 있다. 다음 쿼리는 열1을 먼저 그룹화하고, 그다음 열2를 그룹화한다.SELECT [열1], [열2] FROM [테이블]GROUP BY [열1], [열2]그룹화 열 데이터 개수 확인하기 (COUNT)피벗 테이블처럼 그룹화는 집계 함수와 함께 사용하는데, 그룹별로 데이터 개수를 세는 방법은 COUNT 함수를 활용하면 된다. 다음 쿼리는 이를 구현한 것이며, AS cnt는 개수를 센 결과를 ..
2025.01.04
SQL
no image
PyTorch로 지식 증류(Knowledge Distillation) 구현하기
지식 증류(Knowledge Distillation)는 보다 가벼운 모델을 사용하기 위해 큰 모델에서 작은 모델로 지식을 전달하여 학습의 효율성을 높여주는 방법입니다. (참고) 여기서는 Response-based 기법을 수행하는 것을 구현하려고 합니다.큰 모델(Teacher)과 작은 모델(Student)는 별도로 구현이 완료되어 있고, 여기서 우리가 구현해야 하는 것은 기존의 손실함수 외에 새로운 손실함수를 통합하는 과정입니다.    참고자료PyTorch Knowledge Distillation Tutorial
2025.01.03
반응형

UNION

UNION은 두개 이상의 쿼리 결과를 결합하는데 사용된다. 모든 SELECT문은 같은 숫자의 열을 가져야 하고, 유사한 데이터 형식이어야 하며, 같은 순서로 열이 구성되어야 한다. 기본적인 형식은 다음과 같다.

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

UNION은 기본적으로 중복을 제거한다. 만약 중복된 것까지 포함하고 싶다면 UNION ALL을 사용하자.

SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;

INTERSECT

INTERSECT는 이름처럼 교집합이기 때문에 INNER JOIN과 유사하나, 각 쿼리에서 반환한 결과에서 중복을 제외한다. 기본적인 형식은 다음과 같다.

SELECT column_name(s) FROM table1
INTERSECT
SELECT column_name(s) FROM table2;

EXCEPT

EXCEPT는 한 쿼리(A)에는 있지만 다른 쿼리(B)에는 없는 것을 반환한다. 위와 동일하게 중복값은 제외한다. 기본적인 형식은 다음과 같다.

SELECT column_name(s) FROM table1
EXCEPT
SELECT column_name(s) FROM table2;

전체 정리

위 내용들을 일반화하면 아래와 같이 정리할 수 있다.

query_block [set_op query_block] [set_op query_block] ...

query_block:
    SELECT | TABLE | VALUES

set_op:
    UNION | INTERSECT | EXCEPT

참고자료

  1. W3 School Tutorial
  2. MySQL Documentation
반응형
반응형

공통 테이블 식(Common Table Expression, CTE)은 데이터베이스에 없는 테이블이 필요할 때 사용한다. CTE는 크게 일반 CTE와 재귀 CTE로 나뉜다.

일반 CTE

일반 CTE는 여러 쿼리들을 결합할 때 사용할 수 있다. 기본적인 형식은 다음과 같다.

WITH [CTE 테이블] (열1, 열2 ...)
AS
(
    <SELECT 문>
)
SELECT [열 이름] FROM [CTE_테이블]

위 쿼리는 AS 안에 있는 SELECT문으로 반환하는 열을 가지고 CTE 테이블을 정의한다. 만약 가져오는 SELECT문과 CTE 테이블의 열 개수가 다르면 오류가 반환된다.

재귀 CTE

재귀 CTE는 CTE 결과를 CTE 내부 쿼리에서 재사용하는 구조이다. 이는 주로 계층이나 그래프 형태의 데이터를 검색할 때 많이 사용한다고 한다. 기본적인 형식은 다음과 같다.

WITH [CTE 테이블] (열1, 열2 ...)
AS
(
    <SELECT * FROM 테이블 A> -- 쿼리 1
    UNION ALL
    <SELECT * FROM 테이블 B JOIN CTE_테이블> -- 쿼리 2
)
SELECT [열 이름] FROM [CTE_테이블]

위 구조에서 쿼리1은 앵커 멤버, 쿼리 2는 재귀 멤버라고 한다. 앵커 멤버는 자기 자신 CTE를 참조하지 않고 재귀 멤버 앞에 위치해 재귀 쿼리의 시작을 정의한다. 재귀 멤버는 앵커 멤버의 결과를 기반으로 반복적으로 호출되는 쿼리이다. 동작하는 방식은 다음과 같다.


  1. 쿼리 1을 실행한다. 쿼리 2의 기본값은 0으로 초기화된다.
  2. 쿼리 2를 실행한다. 쿼리 2의 기본값은 1만큼 증가한다. 쿼리 1의 결과 행 수만큼 쿼리 2에서 CTE 테이블을 재귀 호출하고, 쿼리 2 기본값이 1씩 증가하면서 쿼리 1의 결과 행 수까지 도달하면 재귀호출을 중단한다.
  3. 외부 SELECT문에서 1,2 과정을 통해 만든 CTE 결과를 탐색한다.

참고자료

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

서브쿼리(subquery)는 쿼리 안에 포함되는 또 다른 쿼리이다. 조인하지 않고 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 수 있다. 서브쿼리의 주요 특징은 다음과 같다.


- 반드시 소괄호로 감싸 사용
- 주 쿼리를 실행하기 전에 1번만 실행
- 비교 연산자에 서브쿼리를 사용하는 경우 서브쿼리를 오른쪽에 기술
- 내부에는 ORDER BY 사용 불가

WHERE 서브쿼리

WHERE문에 사용하는 서브 쿼리를 중첩 서브쿼리(nested subquery)라고도 한다. 이를 조건문의 일부로 사용할 수 있다.

단일 행

서브쿼리의 결과가 1행만 반환되는 경우이다. 다음은 쿼리 기본 형식이다.

SELECT [열 이름]
FROM [테이블]
WHERE [열] = (SELECT [열] FROM [테이블] WHERE [조건])

주의할 점은 비교 연산자를 사용할 때는 반드시 단일 행 케이스여야 한다. 즉, 가장 바깥의 WHERE에 =,<,> 등을 사용하려면 하나 이하의 결과만 반환해야 오류 없이 동작한다. 만약 반환 결과가 여러 개가 필요하면 IN, ANY, ExISTS, ALL을 사용할 수 있다.

IN

IN은 앞서 설명한 것처럼 OR 대신 사용할 수 있다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT [열 이름]
FROM [테이블]
WHERE [열] IN (SELECT [열] FROM [테이블] WHERE [조건])

ANY

ANY는 하나라도 만족하는 조건을 검색한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
  (SELECT column_name
  FROM table_name
  WHERE condition);

ALL

ALL은 ANY와 다르게 모든 것을 만족하는 것을 검색한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
  (SELECT column_name
  FROM table_name
  WHERE condition);

EXISTS

EXISTS는 조건의 결과가 있는지 없는지를 확인해 1개라도 있으면 TRUE, 없으면 FALSE를 반환한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

만약 결과가 없다면 FALSE이므로 위 쿼리는 아무것도 반환하지 않는다. 이를 반대로 적용하려면 EXISTS 앞에 NOT만 붙여준다.

FROM 서브쿼리

FROM 문에서는 보통 조인을 많이 활용하기 때문에 이와 결합해서 사용한다. 조인인 대상에 별도의 필터링서브쿼리 결과)을 수행하는 것으로 이해된다. 기본 형식은 다음과 같이 사용할 수 있다.(inline view라고도 함)

SELECT [열 이름]
FROM [테이블] AS a
    INNER JOIN (SELECT [열] FROM [테이블] WHERE [조건]) AS b ON a.key = b.key
WHERE [조건]

참고자료

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

1. 잘한 것

  • Leetcode, 백준, 프로그래머스 등 코딩 테스트 문제를 매일 풀었습니다.
  • SQL 공부 및 정리를 지속하고 있습니다.
  • 수업 및 과제를 제시간에 마무리했습니다.

2. 부족한 것

  • 디퓨전 모델에 대한 이론적 지식 및 구현에 대해 충분히 이해하지 못했습니다.
  • 과제의 결과물 퀄리티가 많이 떨어집니다..

3. 배운 것

📖 오디오 처리 라이브러리(librosa, torchaudio)
📖 오디오 데이터 처리 개요
📖 이미지 생성 관련 최신 트렌드 정리

4. 시도할 것

  • 이력서 피드백이 온 것을 바탕으로 수정을 해서 제출할 계획입니다.
  • Transformer에 대한 추가적인 이해가 필요할 것으로 보여
반응형
반응형

INNER JOIN

내부 조인(Inner Join)은 키에 해당하는 각 테이블의 열 값을 비교해 조건에 맞는 값을 검색한다. 기초 교육 과정에서 배운 집합의 관점에서 살펴본다면, 두개의 서로 다른 집합(테이블)의 교집합이라고 생각할 수 있다. 다음은 내부 조인의 기본 형식이다.

SELECT [열]
FROM [테이블1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]

 

여기서 ON문은 조인 조건으로 활용된다. WHERE와의 차이점은 ON은 조인을 수행할 때 조건으로 사용되는 것이고, WHERE는 조인을 완료한 상태에서 데이터를 조회할 때 사용한다.

 

만약 서로 다른 3개 이상의 테이블을 조인한다면 아래처럼 INNER JOIN을 추가하는 방식으로 가능하다.

SELECT [열]
FROM [테이블1]
INNER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
INNER JOIN [테이블3] ON [테이블2.열] = [테이블3.열]
WHERE [검색 조건]

예시

아래는 industry_group 테이블에서 industry가 automobile인 그룹의 열들을 조회하는 쿼리이다. 테이블 간 열 이름이 같을 수 있고, 이로 인해 쿼리가 제대로 동작하지 않거나 불필요하게 쿼리가 길어질 수 있으므로 테이블에 별칭을 AS로 지정하였다.

SELECT 
    a.industry
    c.symbol
    c.company_name
    c.ipo_year
    c.sector   
FROM industry_group AS a
    INNER JOIN industry_group_symbol AS b ON a.num = b.num
    INNER JOIN nasdaq_company AS c ON b.symbol = c.symbol
WHERE a.industry = N'automobile'

OUTER JOIN

외부 조인(OUTER JOIN)은 일치 항목을 고려하지 않고, 한쪽 테이블을 다른 쪽 테이블에 조합할 때 사용한다. 아래는 외부 조인의 기본 형식이다. 여기서 < >로 감싼 항목은 1개만 선택해야 한다는 뜻이다.

SELECT [열]
FROM [테이블1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블2] ON [테이블1.열] = [테이블2.열]
WHERE [검색 조건]

LEFT & RIGHT OUTER JOIN (교집합 포함)

위 기본 형식은 다소 추상적이기에 좀 더 구체적인 쿼리를 살펴보자. LEFT와 RIGHT는 두개의 테이블 중 어느 것을 선택하느냐의 문제이다. SELECT의 대상이 되는 테이블(A)은 왼쪽, 그게 아닌 경우는 다른 테이블(B)로 가정한다. LEFT OUTER JOIN을 하면 우선 A를 모두 포함한다. 그 다음 A와 B의 Key 값을 비교해 교집합 부분을 제외하고서는 NULL 처리를 한다. 이를 쿼리로 나타내면 다음과 같다.

SELECT [열]
FROM A
LEFT OUTER JOIN B ON A.Key = B.Key

LEFT & RIGHT OUTER JOIN (교집합 제외)

위에서 진행한 것에서 교집합 부분을 제외하고 싶다면, 아래와 같이 쿼리를 작성할 수 있다. 만약 SELECT FROM 테이블 대상(A)이 아닌 B 테이블에 진행하고 싶다면 LEFT를 RIGHT로만 바꿔주면 된다.

SELECT [열]
FROM A
LEFT OUTER JOIN B ON B.Key IS NULL

FULL OUTER JOIN

FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 각각 수행한 것이다. 위에서 공부한 두가지를 섞어 보면 교집합 포함 케이스는 집합에서 합집합으로 나타날 것이다.

SELECT [열]
FROM A
FULL OUTER JOIN B ON A.Key = B.Key

만약 교집합은 제외하면 합집합에서 교집합만 뺀 것으로 나타나는데, 이를 쿼리로 표현하면 다음과 같다.

SELECT [열]
FROM A
FULL OUTER JOIN B ON B.Key IS NULL

다만, FULL OUTER JOIN은 많이는 사용하지 않는다고 하는데, 전체에서 데이터의 누락이나 오류가 있을 때 사용한다고 한다. 다음은 그런 예시이다. 2개의 테이블(A, B)에서 symbol 열의 NULL 값을 필터링하는 쿼리다.

SELECT 
    A.symbol
    B.symbol
FROM A
    FULL OUTER JOIN B ON A.symbol = B.symbol
WHERE A.symbol IS NULL OR B.symbol IS NULL

CROSS JOIN

교차 조인(CROSS JOIN)은 각 테이블의 모든 경우의 수를 조합할 때 사용한다. 교차 조인은 테이블1,2의 데이터를 모두 조합해 샘플 데이터를 만들 때 활용할 수 있다. 다음은 교차 조인의 기본 형식이다.

SELECT [열]
FROM [테이블 1]
    CROSS JOIN [테이블 2]
WHERE [검색 조건]

SELF JOIN

셀프 조인(SELF JOIN)은 테이블 자기 자신을 조인에 활용하는 것이다.

 

아래 이미지는 JOIN에 관해 시각적으로 잘 이해될 수 있는 이미지다. 잘 참고해서 JOIN을 이해하자.

JOIN 이미지[2]

 

참고자료

  1. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
  2. https://stackoverflow.com/questions/53949197/isnt-sql-a-left-join-b-just-a
반응형
반응형

기본 디퓨전 모델

여기서 기본 디퓨전 모델은 별도의 조건이 주어지지 않고, 이미지를 생성하는 모델을 말한다.

DDPM (Denoising Diffusion Probabilistic Model)

DDPM은 점진적인 노이즈 추가와 제거 과정을 통해 이미지를 생성한다. 이는 마르코프 체인 기반의 확률적 모델링을 활용한다. 순전파에서는 원본 이미지에 점진적으로 가우시안 노이즈를 추가하고, 역전파에서는 노이즈를 단계적으로 제거하면서 이미지를 복원한다. 이러한 훈련은 U-Net 구조에서 이뤄진다.

Improved DDPM

DDPM에서 노이즈 스케줄링, 가우시안 전이 모델링, 목적함수를 개선하여 나온 모델이다. 이를 통해 샘플링 속도와 학습 효율성을 개선할 수 있었다.

Latent Diffusion Models (LDM)

LDM은 오토인코더를 통해 차원을 축소하고, 저차원의 잠재공간에서 확산 활동이 수행된다. 이를 통해 연산능력에 대한 요구사항이 줄어들고, 더 빠른 학습 및 추론이 가능해졌다. 이로 인해 현재 많이 사용되는 기술인 Stable Diffusion의 기반이 되는 기술이다.


Fast Sampling

여전히 디퓨전 모델은 속도에 관한 문제가 있었고, 이를 극복하기 위해 제안된 것이 샘플링의 속도를 빠르게 하기 위한 노력이 있다.

DDIM (Denoising Diffusion Implicit Models)

DDIM은 이전 이벤트에 의해서 확률이 의존하는 마르코프 프로세스가 아닌 방법으로 샘플링을 진행한다. 이를 통해 샘플링의 속도를 빠르게 하고, 적은 과정만으로도 이미지를 생성할 수 있게 된다.

Progressive Distillation

증류(Distillation)이라는 단어가 있는 것처럼, Teacher - Student 모델을 활용하는 지식 증류에서 방법을 가져와 샘플링 단계를 줄일 수 있다. 먼저 모든 과정으로 학습을 진행하고, 그 다음에는 지식 증류를 수행한다. 이를 반복하면서 전체 스텝을 감소시키고 추론 속도를 향상 시킨다.

Consistency Models

추계 미분 방정식(Stochastic Differential Equation, SDE)을 상미분방정식(Ordinary Differential Equation, ODE)으로 바꾸는 방식이다. SDE를 푸는 것보다는 ODE를 푸는 수치해석적인 방법으로 접근하여 속도를 높이고자 시도하였다.


Text-to-Image Synthesis

쓸만한 이미지를 만들어내는 일은 그동안 예술적인 감각이나 훈련을 받은 사람의 영역이었지만, 이미지 생성 모델이 들어오면서 텍스트만으로 이미지를 생성할 수 있게 되었다.

DALL-E 2

DALL-E 2는 텍스트를 이미지 임베딩으로 바꾸는 Prior와 이미지 임베딩을 실제 이미지로 생성하는 Decoder 두가지 생성 과정을 거친다.

Stable Diffusion

많이 언급되는 모델인 Stable Diffsuion 모델은 CLIP의 잠재 공간에서 확산을 진행하고, VAE를 통해 이미지를 압축하는 구조를 채택해 계층적으로 생성한다.

Imagen

CLIP 대신에 T5 텍스트 인코더를 사용하는 방식으로 생성 크기가 점진적으로 커지는 캐스케이드 방식(64 x 64 ➡️ 256 x 256 ➡️ 1024 x 1024)으로 디퓨전을 실행한다.


Image-to-Image Translation

Image-to-Image Translation은 이미지를 입력으로 다른 이미지를 생성하는 기술이다. 특정 스타일로 변형하는 Stylization, 해상도를 높이는 Super-Resolution 등의 기술이 여기에 속한다.

SDEdit

SDEdit은 대략적인 이미지 (예를 들어, 형태만 갖춘 크로키 같은)에서 정밀한 이미지를 생성할 수 있다. 입력 이미지에서 노이즈를 부분적으로 생성하고 추계 미분방정식을 통한 노이즈를 제거하는 과정을 거치면서 원본의 이미지의 구조는 유지하되, 세부적인 내용만 수정하는 것이 가능하다.

ControlNet

기존 텍스트-이미지 모델에 프롬프팅을 통한 추가적인 제어 기능을 부여해 조금 더 유연하게 이미지를 생성할 수 있도록 한 기술이다. 다른 이미지 해석 문제처럼 엣지, 포즈, Depth map, 이미지 분할 등을 통해 이미지의 구조를 기반으로 텍스트 임베딩을 더해 이미지를 생성한다. 여기서 특징적인 부분은 Zero Convolution을 통해 모델을 확장을 시도했다는 점이다.


Image Customization

Textual inversion

새로운 의미나 개념을 나타내는 토큰(S*)를 학습해 텍스트 임베딩 공간에서 이미지를 생성하는 기술이다. 비교적 적은 수의 이미지로도 학습이 가능하다는 이점이 있다.

DreamBooth

DreamBooth는 특별한 식별자와 클래스의 단어 쌍을 활용하여 특정 주제에 대한 재현과 생성을 가능하게 했다. 클래스 보존을 위해 prior-preservation loss를 도입하였다.


Erasing Concept

생성 이미지는 간혹 저작권이나 적절하지 않은 표현이 발생할 수 있다. 이런 경우에 제거해주는 과정에 대한 연구도 이뤄지고 있다.하나는 학습된 디퓨전 모델에서 특정 개념을 선택적으로 제거하는 기술이다. 제거하고자 하는 개념의 네거티브 샘플을 수집하고, 개념별 마스크를 생성하여 불필요한 개념을 제거하는 것이다. 또 다른 하나는 Regularization을 도입해 전체 모델을 통합적으로 편집하도록 하는 방법이다.


Video Generation

Video Diffusion Model (VDM)

VDM은 이미지 디퓨전 모델에서 비디오로 확장된 버전이다. 주요 변화는 3D U-Net 구조를 사용했고, 시공간에 대한 어텐션 메커니즘을 채택했다.

Video Probabilistic Diffusion Model (VPDM)

VPDM은 압축된 잠재 공간에서 비디오를 생성해 메모리 효율적으로 이뤄진다는 특징이 있다. 이미지보다 복잡해진 상황에서 NeRF와 같이 압축적으로 정보를 표현하는 방식을 도입해 디퓨전이 가능하도록 했다.

Align your Latents: High-Resolution Video Synthesis

VPDM에서 더 나아가 정렬된 잠재 표현을 사용해 비디오를 생성하는 방식이다. 이는 비디오는 이미지(프레임)이 연속적으로 이뤄진 집합체고, 인접한(시간이 거의 비슷한) 장면끼리는 유사하다는 사실을 활용해 높은 시간적 일관성을 달성했다.


3D

DreamFusion

DreamFusion은 텍스트 프롬프트로부터 3D를 생성하는 모델이다. Score Distillation Sampling (SDS)을 사용해 학습하고, NeRF 기반으로 3D를 표현한다.

Zero-1-to-3

하나의 단면인 이미지를 보고 3D 모델을 생성하는 방식이다. 하나의 이미지만 있으면 되기 때문에 제로샷 방식이라고 할 수 있다.

Consistent 1-to-3

위의 Zero 1-to-3에서 더 나아가 프레임 단위로 학습되는 것을 연속성이 있게 만들 수 있도록 수정된 모델이다. Epipolar guided attention과 multi-view attention을 조합하여 사용한다.

참고자료

  1. 유재준. Recent Applications in Diffusion Models. 부스트캠프.
반응형
반응형

데이터베이스 다루기

SELECT, INSERT, UPDATE, DELETE 등 데이터 조작 언어(Data Manipulation Language, DML)는 테이블을 대상으로 한다. 따라서 이러한 구문을 사용하기 위한 테이블을 생성(CREATE), 변경(ALTER), 삭제(DROP)하는 기능이 필요한데, 이를 데이터 정의 언어(Data Definition Language)라고 한다.

데이터베이스 생성 및 삭제

데이터베이스 생성하기 위한 기본 형식은 다음과 같다.

CREATE DATABASE [데이터베이스 이름]

데이터베이스를 삭제하기 위한 기본 형식은 다음과 같다.

DROP DATABASE [데이터베이스 이름]

테이블 다루기

테이블은 데이터베이스의 내부에 있는 개념으로 다루기 위해서는 데이터베이스를 먼저 선택해야 한다.

USE [데이터베이스 이름]

테이블 생성 및 삭제

테이블을 생성하기 위한 기본 형식은 다음과 같다.

CREATE TABLE [테이블 이름] (
열1 자료형,
열2 자료형,
...
)

테이블을 삭제하기 위한 기본 형식은 다음과 같다. 만약 다른 테이블과 종속관계이면서 부모테이블인 경우 삭제가 되지 않는 경우가 있다면, 종속관계를 제거한 뒤 자식테이블을 삭제한 후에야 부모테이블을 삭제할 수 있다.

DROP TABLE [테이블 이름]

만약 NULL을 허용하지 않는 테이블을 만들기 위해서는 아래와 같이 자료형 이후에 NOT NULL을 넣어서 쿼리를 작성하면 된다.

CREATE TABLE [테이블 이름] (
열1 자료형 NOT NULL

데이터 삽입, 수정, 삭제하기

데이터를 삽입하기 위한 기본 형식은 다음과 같다. 열 이름을 생략해서도 가능한데, 이를 위해서는 테이블의 열 순서와 개수에 맞춰서 데이터를 채워줘야 한다.

INSERT INTO 테이블 (열1, 열2, ...) VALUES (값1, 값2, ...)

테이블에 삽입된 데이터를 수정하려면 UPDATE를 다음과 같이 사용한다. 여기서 WHERE문은 생략할 수 있으나, 이 경우 테이블 전체 데이터를 수정하기 때문에 주의가 필요하다.

UPDATE [테이블 이름] SET 열1 = 값1, 열2 = 값2, ...
WHERE [열] = [조건]

입력된 데이터를 삭제하려면 DELETE를 사용하는데, 사용법은 UPDATE와 거의 유사하다. 여기서도 WHERE은 생략 가능하나, 이 경우 테이블 전체 데이터를 수정하게 된다.

DELETE [테이블 이름] 

외래키 연결의 경우

앞서 테이블의 삭제 부분에서 테이블이 종속관계에 있으면 삭제가 제대로 되지 않는다고 언급한 바 있다. 이는 관계형 데이터베이스 구축의 기본으로 부모 테이블의 기본키를 참조하는 외래키를 추가할 수 있다.

ADD FOREIGN KEY (열1) REFERENCES 테이블 이름(열1)

이렇게 연결된 경우 자식 테이블에 데이터를 바로 입력/삭제하려고 하면 실패를 하게 된다. 이를 방지하기 위해 부모 테이블에 데이터를 입력/삭제하고 같은 데이터를 자식 테이블에 입력하는 방식으로 데이터를 입력/삭제할 수 있다.

-- 입력
INSERT INTO 부모테이블 VALUES (1)
INSERT INTO 자식테이블 VALUES (1)

-- 삭제
DELETE 자식테이블 WHERE 열1 = 1
DELETE 부모테이블 WHERE 열1 = 1

다른 테이블에 검색 결과 입력

기존 테이블에서 검색한 결과를 다른(대상) 테이블에 입력해서 데이터를 옮기고 싶을 수 있다. 예를 들어, 필요한 데이터만 따로 발췌해서 기존 테이블에 합치는 것과 같은 작업을 수행하는 것이다. 이를 위해서는 아래와 같은 구조로 옮겨줄 수 있다.

INSERT 대상 테이블
SELECT 열 FROM 기존 테이블
WHERE 조건문

새 테이블에 검색 결과 입력

위와 비슷하지만, 검색 결과를 저장하기 위해 새로운 테이블에 저장하는 방법이다. 이는 테이블의 데이터를 복사할 때 사용하면 유용할 것이다. 방법은 아래와 같이 쿼리를 작성하면 된다.

SELECT 열 INTO 새 테이블 FROM 기존 테이블
WHERE 조건문
반응형
반응형

그룹화하기

엑셀의 피벗 테이블처럼 데이터를 그룹화하고, 필터링 하는 기능은 GROUP BY와 HAVING을 통해 구현할 수 있다. 아래는 기본 형식이다.

SELECT [열] FROM [테이블]
WHERE [열] = [조건값]
GROUP BY [열]
HAVING [열] = [조건값]

여기서 GROUP BY로 열은 여러개를 지정할 수 있다. 다음 쿼리는 열1을 먼저 그룹화하고, 그다음 열2를 그룹화한다.

SELECT [열1], [열2] FROM [테이블]
GROUP BY [열1], [열2]

그룹화 열 데이터 개수 확인하기 (COUNT)

피벗 테이블처럼 그룹화는 집계 함수와 함께 사용하는데, 그룹별로 데이터 개수를 세는 방법은 COUNT 함수를 활용하면 된다. 다음 쿼리는 이를 구현한 것이며, AS cnt는 개수를 센 결과를 출력할 때 열 이름을 cnt로 한다는 뜻이다. 다만, cnt는 실제 데이터가 아니라 출력에만 활용되므로 GROUP BY나 HAVING에서 찾는 열에서는 활용할 수 없다. 최종적으로 출력할 때 개수에 따라 정렬까지 수행하였다.

SELECT [열], COUNT(*) AS cnt FROM [테이블]
GROUP BY [열]
ORDER BY COUNT(*)

데이터 필터링 하기 (HAVING)

그룹화 데이터 필터링을 위해서는 HAVING을 사용한다. WHERE와 차이점은 WHERE 문은 테이블에 있는 열에 적용하는 것이고, HAVING은 SELECT나 GROUP BY에 있는 열에만 적용 가능하다. 아래 예시는 그룹화 열 데이터 개수가 100 이상인 것만 조회하는 쿼리이다.

SELECT [열], COUNT(*) AS cnt FROM [테이블]
GROUP BY [열]
HAVING COUNT(*) >= 100

중복 데이터 제거하기 (DISTINCT)

GROUP BY는 그룹화를 통해 중복을 제거할 수 있지만, 이외에 SELECT DISTINCT를 통해 중복 데이터를 제거할 수 있다. 아래 기본 형식은 해당 열의 중복 데이터를 제거하른 쿼리이다. 다만, 집계하는데 활용하기에는 제한이 있다.

SELECT DISTINCT [열] FROM [테이블]
반응형
반응형

지식 증류(Knowledge Distillation)는 보다 가벼운 모델을 사용하기 위해 큰 모델에서 작은 모델로 지식을 전달하여 학습의 효율성을 높여주는 방법입니다. (참고) 여기서는 Response-based 기법을 수행하는 것을 구현하려고 합니다.



큰 모델(Teacher)과 작은 모델(Student)는 별도로 구현이 완료되어 있고, 여기서 우리가 구현해야 하는 것은 기존의 손실함수 외에 새로운 손실함수를 통합하는 과정입니다.



 

 

 

 

참고자료

  1. PyTorch Knowledge Distillation Tutorial
반응형