Skip to main content
Summary

기울기를 안다고 끝은 아니다

앞 장에서 우리는 학습률, 배치, 에폭을 배웠습니다. 이제 딥러닝 학습의 기본 장면을 다시 떠올려 봅시다.

모델이 예측합니다. 예측이 틀린 정도를 손실 함수로 계산합니다. 역전파는 각 가중치가 그 손실에 얼마나 영향을 주었는지 기울기로 알려 줍니다. 그리고 경사하강법은 그 기울기를 이용해 가중치를 조금씩 고칩니다.

여기까지 들으면 학습은 아주 단순해 보입니다.

"기울기의 반대 방향으로 가면 되는 것 아닌가?"

맞습니다. 기본 원리는 그렇습니다. 하지만 실제 딥러닝에서는 그 길이 매끈한 내리막길이 아닙니다. 울퉁불퉁하고, 좁은 골짜기가 있고, 어떤 방향으로는 급격히 기울어져 있고, 어떤 방향으로는 거의 평평합니다. 게다가 우리는 전체 데이터를 한 번에 보지 않고 미니배치 단위로 조금씩 보기 때문에, 매번 계산되는 기울기도 흔들립니다.

이때 필요한 것이 최적화 알고리즘입니다. 최적화 알고리즘은 한마디로 말해, 기울기를 어떻게 활용해 파라미터를 업데이트할지 정하는 방법입니다.

같은 모델, 같은 데이터, 같은 손실 함수를 쓰더라도 최적화 알고리즘이 달라지면 학습 속도와 안정성이 크게 달라질 수 있습니다. 어떤 방법은 단순하지만 많이 흔들리고, 어떤 방법은 이전 움직임을 기억해 더 부드럽게 나아갑니다. 또 어떤 방법은 파라미터마다 다른 보폭을 적용해 더 영리하게 움직입니다.

이번 장에서는 가장 기본이 되는 SGD에서 출발해 Momentum, RMSProp, Adam으로 이어지는 흐름을 살펴보겠습니다.

최적화 알고리즘

SGD: 가장 단순한 출발점

가장 기본적인 경사하강법의 업데이트는 다음과 같습니다.

새 가중치 = 기존 가중치 - 학습률 × 기울기

수식으로 쓰면 이렇게 표현할 수 있습니다.

θ = θ - η × ∇L(θ)

여기서 θ는 모델의 파라미터, 즉 가중치와 편향을 뜻합니다. η는 학습률입니다. ∇L(θ)는 손실 함수의 기울기입니다.

SGD는 Stochastic Gradient Descent, 즉 확률적 경사하강법입니다. 여기서 "확률적"이라는 말은 보통 전체 데이터를 전부 사용하지 않고, 무작위로 뽑은 일부 데이터, 즉 미니배치를 사용해 기울기를 계산한다는 뜻입니다.

전체 데이터가 100만 개라고 해 봅시다. 매번 100만 개를 모두 보고 기울기를 계산하면 너무 느립니다. 대신 32개, 64개, 128개 정도의 데이터만 보고 "대략 이 방향으로 가면 손실이 줄겠군" 하고 판단합니다. 이것이 미니배치 학습입니다.

이 방식은 빠릅니다. 하지만 한 가지 문제가 있습니다. 매번 보는 데이터가 다르기 때문에 기울기도 조금씩 달라집니다. 어떤 배치는 고양이 사진이 많고, 어떤 배치는 강아지 사진이 많을 수 있습니다. 어떤 배치에서는 손실을 줄이는 방향이 왼쪽 아래처럼 보이고, 다음 배치에서는 오른쪽 아래처럼 보일 수 있습니다.

그래서 SGD의 움직임은 종종 이렇게 느껴집니다.

내려가긴 내려가는데,
좌우로 흔들리며 지그재그로 내려간다.

이 흔들림은 나쁜 것만은 아닙니다. 약간의 무작위성은 모델이 특정 지점에 너무 쉽게 갇히지 않게 도와줄 수도 있습니다. 하지만 흔들림이 너무 크면 학습이 느려지고, 손실 값이 불안정하게 출렁이며, 좋은 지점에 도달하는 데 오래 걸립니다.

SGD는 단순하고 강력합니다. 그러나 딥러닝 모델이 깊어지고 파라미터가 많아질수록 "그냥 기울기 방향으로 한 걸음"만으로는 아쉬운 순간이 많아집니다.

지그재그로 내려가는 이유

SGD가 흔들리는 이유를 조금 더 직관적으로 생각해 봅시다.

산에서 아래로 내려간다고 상상해 보겠습니다. 그런데 이 산은 둥근 언덕이 아니라 좁고 긴 골짜기처럼 생겼습니다. 골짜기의 양옆은 매우 가파르고, 골짜기를 따라 내려가는 방향은 완만합니다.

이런 곳에서 기울기만 보고 움직이면 어떻게 될까요?

양옆 벽이 가파르기 때문에 기울기는 자꾸 옆 방향으로 크게 나타납니다. 그래서 한 번은 왼쪽 벽으로, 다음에는 오른쪽 벽으로 튕기듯 움직입니다. 정작 우리가 가고 싶은 방향은 골짜기를 따라 아래로 내려가는 방향인데, 많은 에너지가 좌우 흔들림에 쓰입니다.

딥러닝의 손실 지형도 이와 비슷한 경우가 많습니다. 어떤 파라미터 방향으로는 손실이 매우 민감하게 변하고, 다른 방향으로는 천천히 변합니다. 모든 파라미터에 똑같은 학습률을 적용하면, 어떤 방향에서는 너무 크게 움직이고, 어떤 방향에서는 너무 작게 움직일 수 있습니다.

이 문제를 해결하는 첫 번째 아이디어는 간단합니다.

"이전에도 계속 같은 방향으로 갔다면, 그 방향을 조금 더 믿어 보자."

이 생각이 Momentum입니다.

Momentum: 이전 방향을 기억하는 힘

Momentum은 우리말로 "관성" 또는 "운동량"이라고 번역할 수 있습니다. 물리에서 무거운 공이 굴러가면 쉽게 멈추지 않고 계속 나아가려는 성질이 있습니다. 딥러닝 최적화에서도 비슷한 아이디어를 사용합니다.

SGD는 매 순간의 기울기만 보고 움직입니다. 반면 Momentum은 이전에 움직이던 방향을 어느 정도 기억합니다.

이번 업데이트 = 현재 기울기 + 이전 업데이트의 일부

조금 더 수식처럼 쓰면 다음과 같습니다.

v = β × v + η × g
θ = θ - v

여기서 g는 현재 기울기입니다. v는 지금까지의 이동 방향이 누적된 값입니다. β는 이전 방향을 얼마나 유지할지 정하는 값입니다. 보통 0.9 같은 값을 많이 사용합니다.

Momentum의 핵심은 단순합니다.

모델이 여러 번 연속해서 비슷한 방향으로 이동하고 있다면, 그 방향은 꽤 믿을 만한 방향일 가능성이 큽니다. 그러면 보폭을 조금 더 실어 줍니다. 반대로 어떤 방향의 기울기가 매번 왔다 갔다 바뀐다면, 서로 상쇄되어 흔들림이 줄어듭니다.

좁은 골짜기 예시로 돌아가 봅시다. 좌우 방향의 기울기는 계속 방향이 바뀝니다. 한 번은 왼쪽, 다음에는 오른쪽입니다. Momentum은 이런 흔들림을 평균내듯 줄여 줍니다. 반면 골짜기를 따라 내려가는 방향은 계속 비슷합니다. 그래서 그 방향의 움직임은 점점 힘을 얻습니다.

즉 Momentum은 SGD의 지그재그를 줄이고, 일관된 방향으로 더 빠르게 나아가게 합니다.

이제 최적화 알고리즘은 단순히 "현재 기울기만 보는 방식"에서 "과거의 움직임까지 고려하는 방식"으로 한 단계 발전했습니다.

모든 파라미터에 같은 보폭을 써도 될까

Momentum은 이전 방향을 기억합니다. 하지만 아직 한 가지 중요한 문제가 남아 있습니다.

모든 파라미터가 같은 학습률을 가져야 할까요?

신경망에는 수많은 파라미터가 있습니다. 어떤 가중치는 손실에 자주 큰 영향을 줍니다. 어떤 가중치는 가끔만 영향을 줍니다. 어떤 파라미터는 기울기가 계속 크게 나오고, 어떤 파라미터는 기울기가 아주 작게 나옵니다.

그런데 기본 SGD는 모든 파라미터에 같은 학습률을 적용합니다.

이 파라미터도 학습률 0.01
저 파라미터도 학습률 0.01
멀리 있는 파라미터도 학습률 0.01
자주 바뀌는 파라미터도 학습률 0.01

이 방식은 공평해 보이지만, 꼭 영리하지는 않습니다.

예를 들어 어떤 파라미터는 기울기가 계속 크게 나옵니다. 이 파라미터에 같은 학습률을 적용하면 업데이트가 너무 커져 손실 지형을 튕겨 다닐 수 있습니다. 반대로 어떤 파라미터는 기울기가 계속 작게 나옵니다. 이 파라미터는 업데이트가 너무 작아 거의 배우지 못할 수 있습니다.

그래서 등장한 아이디어가 파라미터마다 업데이트 크기를 다르게 조절하자는 것입니다.

이 방향의 대표적인 알고리즘이 RMSProp입니다.

RMSProp: 파라미터마다 보폭을 다르게

RMSProp은 각 파라미터마다 최근 기울기의 크기를 기억합니다. 더 정확히는 기울기의 제곱을 이동 평균으로 저장합니다.

왜 제곱을 사용할까요? 기울기는 양수일 수도 있고 음수일 수도 있습니다. 그냥 평균을 내면 서로 상쇄될 수 있습니다. 하지만 제곱하면 방향은 사라지고 크기만 남습니다. 즉 "이 파라미터는 최근에 얼마나 크게 흔들렸는가?"를 볼 수 있습니다.

RMSProp의 흐름은 대략 다음과 같습니다.

최근 기울기 크기의 평균을 저장한다.
기울기가 자주 큰 파라미터는 보폭을 줄인다.
기울기가 작은 파라미터는 상대적으로 보폭을 유지한다.

수식으로는 다음과 같이 표현할 수 있습니다.

s = ρ × s + (1 - ρ) × g²
θ = θ - η × g / (√s + ε)

여기서 s는 기울기 제곱의 이동 평균입니다. ρ는 이전 평균을 얼마나 유지할지 정하는 값입니다. ε는 아주 작은 숫자로, 0으로 나누는 문제를 막기 위해 더합니다.

이 수식에서 중요한 부분은 분모의 √s입니다.

어떤 파라미터의 기울기가 최근 계속 컸다면 s가 커집니다. 그러면 √s도 커지고, 전체 업데이트 크기는 작아집니다. 반대로 어떤 파라미터의 기울기가 작았다면 s가 작으므로 업데이트가 지나치게 줄어들지 않습니다.

RMSProp은 한마디로 이렇게 이해할 수 있습니다.

많이 흔들리는 파라미터는 조심스럽게,
덜 움직이는 파라미터는 필요한 만큼 움직이게 한다.

이 방식은 특히 손실 지형의 방향별 기울기 차이가 큰 경우에 도움이 됩니다. 어느 방향으로는 너무 가파르고, 어느 방향으로는 완만한 상황에서 파라미터별로 보폭을 조절하면 학습이 더 안정적으로 진행될 수 있습니다.

Adam: Momentum과 RMSProp의 결합

이제 두 가지 좋은 아이디어가 생겼습니다.

Momentum은 이전 업데이트 방향을 기억합니다. 덕분에 일관된 방향으로 더 빠르게 나아가고, 불필요한 흔들림을 줄입니다.

RMSProp은 파라미터마다 최근 기울기 크기를 기억합니다. 덕분에 각 파라미터에 맞는 보폭을 적용할 수 있습니다.

그렇다면 자연스럽게 이런 생각이 듭니다.

"둘을 합치면 더 좋지 않을까?"

Adam은 바로 이 아이디어에서 출발합니다. Adam은 Adaptive Moment Estimation의 줄임말입니다. 이름은 조금 어렵지만 핵심은 명확합니다.

Adam은 기울기의 평균을 기억하고, 기울기 제곱의 평균도 기억합니다.

기울기의 평균은 Momentum과 비슷한 역할을 합니다. 어느 방향으로 계속 이동하는지 기억합니다. 기울기 제곱의 평균은 RMSProp과 비슷한 역할을 합니다. 각 파라미터의 기울기 크기를 보고 보폭을 조절합니다.

간단히 표현하면 Adam은 이렇게 움직입니다.

1. 현재 기울기를 계산한다.
2. 기울기의 이동 평균을 업데이트한다.
3. 기울기 제곱의 이동 평균을 업데이트한다.
4. 두 정보를 함께 사용해 파라미터를 수정한다.

수식으로는 조금 복잡해 보일 수 있습니다.

m = β₁ × m + (1 - β₁) × g
v = β₂ × v + (1 - β₂) × g²
θ = θ - η × m / (√v + ε)

여기서 m은 기울기의 이동 평균입니다. Momentum에서의 이동 방향 기억과 비슷합니다. v는 기울기 제곱의 이동 평균입니다. RMSProp에서 보았던 파라미터별 크기 조절과 비슷합니다.

실제 Adam에는 초반 이동 평균이 0에 치우치는 문제를 보정하는 과정도 들어갑니다. 이것을 편향 보정이라고 합니다. 처음에는 m과 v가 0에서 시작하기 때문에, 초기 몇 번의 업데이트 값이 실제보다 작게 추정될 수 있습니다. Adam은 이 부분을 보정해 초반 학습도 더 안정적으로 만듭니다.

하지만 지금 단계에서 Adam을 이해하는 데 가장 중요한 문장은 이것입니다.

Adam은 방향을 기억하는 Momentum과,
파라미터별 보폭을 조절하는 RMSProp을 결합한 최적화 알고리즘이다.

그래서 Adam은 많은 딥러닝 실험에서 기본 선택지처럼 사용됩니다. 특히 처음 모델을 만들고 학습을 시작할 때 Adam은 꽤 안정적인 출발점을 제공합니다.

네 가지 방법을 한눈에 보기

지금까지 본 방법들을 비교해 보면 다음과 같습니다.

알고리즘핵심 아이디어장점주의할 점
SGD현재 기울기만 보고 이동단순하고 이해하기 쉽다지그재그로 흔들리며 느릴 수 있다
Momentum이전 업데이트 방향을 기억흔들림을 줄이고 일관된 방향으로 가속관성 때문에 지나칠 수 있다
RMSProp파라미터별로 기울기 크기를 기억각 파라미터에 맞게 보폭 조절설정값에 따라 학습 양상이 달라진다
AdamMomentum과 RMSProp 결합빠르고 안정적인 경우가 많다항상 최고의 선택은 아니며 학습률 조정이 필요할 수 있다

이 표에서 가장 중요한 차이는 "무엇을 기억하느냐"입니다.

SGD는 기억하지 않습니다. 지금 기울기만 보고 움직입니다.

Momentum은 이전 움직임을 기억합니다. 그래서 방향 감각이 생깁니다.

RMSProp은 파라미터마다 기울기가 얼마나 컸는지 기억합니다. 그래서 보폭 감각이 생깁니다.

Adam은 방향 감각과 보폭 감각을 함께 사용합니다.

최적화 알고리즘은 운전 방식이다

모델을 학습시키는 과정을 자동차 운전에 비유해 봅시다.

손실 함수는 목적지까지 남은 거리입니다. 기울기는 어느 방향으로 내려가야 하는지 알려 주는 경사 표시판입니다. 학습률은 액셀을 얼마나 밟을지에 해당합니다. 배치 크기는 한 번에 참고하는 도로 정보의 양이라고 볼 수 있습니다.

그렇다면 최적화 알고리즘은 무엇일까요?

최적화 알고리즘은 운전 방식입니다.

초보 운전자는 매 순간 핸들을 크게 꺾습니다. 도로가 조금만 휘어도 왼쪽, 오른쪽으로 흔들립니다. 이것은 기본 SGD와 비슷합니다.

조금 능숙한 운전자는 차가 이미 가고 있던 방향을 고려합니다. 불필요하게 핸들을 꺾지 않고 부드럽게 나아갑니다. 이것은 Momentum과 비슷합니다.

더 능숙한 운전자는 도로 상태에 따라 속도를 조절합니다. 미끄러운 길에서는 천천히, 안정적인 길에서는 조금 더 빠르게 갑니다. 이것은 RMSProp과 비슷합니다.

Adam은 이 두 가지를 함께 하려는 운전자입니다. 차가 가던 방향도 보고, 도로 상태도 보면서 속도와 방향을 조절합니다.

물론 Adam이 언제나 완벽한 운전자인 것은 아닙니다. 어떤 문제에서는 SGD에 Momentum을 더한 방식이 더 좋은 일반화 성능을 보일 수 있습니다. 어떤 문제에서는 Adam의 학습률을 낮춰야 안정적으로 학습됩니다. 하지만 처음 딥러닝을 시작할 때 Adam은 매우 좋은 기본 선택지입니다.

PyTorch에서는 어떻게 보일까

이 책의 다음 부에서는 PyTorch를 본격적으로 사용할 것입니다. 아직 PyTorch 문법을 자세히 배운 것은 아니지만, 최적화 알고리즘이 실제 코드에서 어디에 나타나는지 미리 살짝 보겠습니다.

PyTorch에서는 보통 모델을 만든 뒤, optimizer를 따로 정의합니다.

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

이 코드는 모델의 파라미터를 SGD 방식으로 업데이트하겠다는 뜻입니다. Momentum을 추가하고 싶다면 다음처럼 쓸 수 있습니다.

optimizer = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9)

Adam은 더 간단하게 이렇게 사용합니다.

optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

학습 루프 안에서는 보통 다음 흐름이 반복됩니다.

optimizer.zero_grad()
loss.backward()
optimizer.step()

여기서 loss.backward()는 역전파를 통해 각 파라미터의 기울기를 계산합니다. 그리고 optimizer.step()이 바로 그 기울기를 사용해 파라미터를 업데이트합니다.

즉, 최적화 알고리즘의 차이는 optimizer.step() 안에서 실제로 일어납니다. SGD라면 현재 기울기를 그대로 사용합니다. Momentum이 있다면 이전 업데이트를 함께 고려합니다. Adam이라면 기울기의 평균과 기울기 제곱의 평균을 함께 사용합니다.

겉으로 보이는 코드는 한 줄 차이지만, 그 안에서 파라미터가 움직이는 방식은 크게 달라질 수 있습니다.

Adam을 쓰면 다 해결될까

초보자는 종종 이렇게 생각합니다.

"Adam이 좋다니까 그냥 Adam만 쓰면 되는 것 아닌가?"

실전에서는 Adam을 먼저 선택하는 경우가 많습니다. 특히 텍스트 모델, Transformer 계열 모델, 복잡한 신경망에서는 Adam 또는 Adam 계열 최적화 알고리즘이 널리 사용됩니다. 하지만 이것이 Adam이 항상 정답이라는 뜻은 아닙니다.

최적화 알고리즘은 손실을 줄이는 방법입니다. 그런데 우리가 정말 원하는 것은 훈련 데이터의 손실만 낮추는 것이 아니라, 새로운 데이터에서도 잘 작동하는 모델입니다. 어떤 경우에는 Adam이 훈련 손실을 빠르게 낮추지만, 검증 데이터에서는 기대만큼 좋지 않을 수 있습니다. 반대로 SGD에 Momentum을 더한 방법이 더 천천히 학습되더라도 최종적으로 더 좋은 일반화 성능을 보일 때도 있습니다.

또한 Adam을 쓴다고 학습률 문제가 사라지는 것도 아닙니다. Adam은 파라미터별로 업데이트 크기를 조절하지만, 전체적인 학습률 lr은 여전히 중요합니다. 학습률이 너무 크면 Adam도 불안정해질 수 있고, 너무 작으면 학습이 느려집니다.

그러므로 현실적인 출발점은 다음과 같습니다.

  • 처음 실험할 때는 Adam을 사용해 빠르게 기준 성능을 만든다.

  • 학습이 불안정하면 학습률을 낮추거나 배치 크기, 초기화, 데이터 전처리를 함께 점검한다.

  • 성능을 더 끌어올리고 싶다면 SGD with Momentum 같은 다른 최적화 알고리즘도 비교해 본다.

이때 중요한 태도는 "좋다는 알고리즘을 믿고 끝내는 것"이 아니라, 손실 곡선과 검증 성능을 보며 모델이 어떻게 배우고 있는지 관찰하는 것입니다.

손실 곡선을 읽는 습관

최적화 알고리즘을 바꾸면 손실 곡선의 모양도 달라집니다.

SGD는 손실이 비교적 출렁이며 내려갈 수 있습니다. 특히 배치 크기가 작거나 학습률이 크면 손실 그래프가 톱니처럼 보일 수 있습니다.

Momentum을 사용하면 출렁임이 줄고 더 부드럽게 내려가는 경우가 많습니다. 다만 관성이 생기기 때문에 학습률이 너무 크면 좋은 지점을 지나쳐 손실이 다시 커질 수도 있습니다.

RMSProp이나 Adam은 초반에 손실을 빠르게 낮추는 경우가 많습니다. 파라미터별로 보폭을 조절하기 때문에 복잡한 손실 지형에서도 안정적으로 움직일 가능성이 높습니다. 하지만 그래프가 좋아 보인다고 해서 항상 최종 모델이 가장 좋은 것은 아닙니다. 검증 데이터에서의 성능도 함께 봐야 합니다.

딥러닝 실험을 할 때는 단순히 "정확도가 몇 퍼센트인가?"만 보지 말고, 손실이 어떤 방식으로 변하는지 보는 습관을 들이는 것이 좋습니다. 손실 곡선은 모델이 보내는 신호입니다.

손실이 전혀 줄지 않는다면 학습률이 너무 작거나, 모델 구조에 문제가 있거나, 데이터와 라벨이 잘못되었을 수 있습니다. 손실이 갑자기 폭발한다면 학습률이 너무 크거나 기울기가 지나치게 커졌을 수 있습니다. 훈련 손실은 줄어드는데 검증 손실이 올라간다면 과적합을 의심해야 합니다.

최적화 알고리즘은 이 신호를 바꾸는 중요한 손잡이입니다.

이번 장의 핵심 정리

최적화 알고리즘은 기울기를 이용해 파라미터를 어떻게 업데이트할지 정하는 방법입니다. 기본 SGD는 현재 미니배치에서 계산한 기울기를 따라 단순하게 이동합니다. 이 방식은 간단하지만, 미니배치마다 기울기가 달라지기 때문에 지그재그로 흔들리며 내려갈 수 있습니다.

Momentum은 이전 업데이트 방향을 기억해 관성을 만듭니다. 계속 같은 방향으로 나타나는 기울기는 더 강하게 반영하고, 왔다 갔다 흔들리는 방향은 줄여 줍니다. 그래서 좁은 골짜기 같은 손실 지형에서 더 부드럽고 빠르게 내려갈 수 있습니다.

RMSProp은 파라미터마다 최근 기울기 크기를 기억합니다. 기울기가 자주 큰 파라미터는 보폭을 줄이고, 상대적으로 작은 파라미터는 필요한 만큼 움직이게 합니다. 모든 파라미터에 같은 보폭을 적용하는 대신, 파라미터별로 적응적인 업데이트를 수행하는 방식입니다.

Adam은 Momentum과 RMSProp의 장점을 결합합니다. 기울기의 평균을 이용해 방향을 기억하고, 기울기 제곱의 평균을 이용해 파라미터별 보폭을 조절합니다. 그래서 많은 딥러닝 작업에서 안정적이고 빠른 기본 선택지로 사용됩니다.

이제 우리는 딥러닝 학습의 핵심 흐름을 꽤 멀리까지 왔습니다. 모델은 예측하고, 손실 함수는 틀린 정도를 계산하며, 역전파는 각 파라미터의 책임을 기울기로 전달합니다. 학습률, 배치, 에폭은 학습의 리듬을 만들고, 최적화 알고리즘은 그 기울기를 더 영리하게 사용합니다.

다음 장부터는 이 모든 개념을 실제 코드로 다룰 준비를 합니다. 딥러닝 프레임워크 PyTorch의 기본 재료인 텐서를 이해하면, 지금까지 머릿속에서만 움직이던 계산들이 코드 위에서 살아 움직이기 시작할 것입니다.

책 목록

처음 만나는 딥러닝: 신경망에서 Transformer와 LLM까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기