HOW AI WORKS

행 합성곱은
어떻게 미래를 엿보는가

행 합성곱(row convolution)은 Deep Speech 2가 순환층 스택 맨 위에 얹은 층 하나입니다. 하는 일은 한 문장으로 끝납니다 — 각 뉴런이 자기 자신의 미래 몇 스텝을 가중평균해서 섞어 온다. 이 문서는 그 연산이 정확히 무엇인지부터 숫자로 확인한 다음, Baidu가 왜 굳이 이런 제약투성이 층을 만들어야 했는지로 넘어갑니다.

원 논문: Deep Speech 2: End-to-End Speech Recognition in English and Mandarin (Amodei et al., Baidu Research, arXiv:1512.02595 · ICML 2016) — 행 합성곱은 3.7절, 배포 결과는 7절

차례

§1~§3이 무슨 연산인가, §4부터가 왜 그런 연산인가입니다.

  1. 이 층이 하는 일 — 모양은 그대로, 값만 바뀐다
  2. W의 각 행은 그 채널의 시간축 필터다
  3. 정의 — 왜 하필 "행" 합성곱인가 (식 11)
  4. 그래서 왜? — 양방향 RNN은 "말이 끝나야" 시작한다
  5. 왜 미래를 봐야 하는가 — 증거는 늦게 도착한다
  6. τ와 지연 시간 — 발화 길이 vs 상수
  7. 파라미터 — 채널을 섞었다면 어땠을까
  8. 위치 — 왜 "모든 순환층 위"인가
  9. 논문의 결과 — 근사가 원본을 이겼다
  10. 그 후 — depthwise conv와 스트리밍 ASR
  11. 정리 — 한 문장으로
  12. 이해도 퀴즈

§1 이 층이 하는 일 — 모양은 그대로, 값만 바뀐다

동기나 배경은 잠시 접어 두고, 이 층에 무엇이 들어가서 무엇이 나오는지부터 봅시다.

입력:  h — 길이 T의 벡터 시퀀스, 각 벡터는 d차원      (T × d)
출력:  r — 길이 T의 벡터 시퀀스, 각 벡터는 d차원      (T × d)

차원도 그대로, 길이도 그대로입니다. 모양을 바꾸지 않는 층이에요. 값만 바뀝니다. 아래 순환층들이 만들어 놓은 표현을 살짝 손보는 역할이죠.

한 칸을 계산해 보기

d=3(뉴런 3개), τ=2(미래 2스텝)로 놓겠습니다. 시각 t의 출력을 만드는 데 필요한 재료는 이렇습니다.

h[t]   = [ 0.5, -0.2,  0.9]      ← 지금
h[t+1] = [ 0.1,  0.8, -0.3]      ← 한 스텝 뒤
h[t+2] = [-0.4,  0.3,  0.6]      ← 두 스텝 뒤

W[1] = [1.0, 0.5, 0.2]           ← 1번 뉴런 전용 가중치
W[2] = [0.2, 1.0, 0.3]           ← 2번 뉴런 전용
W[3] = [0.6, 0.6, 0.6]           ← 3번 뉴런 전용

계산은 이렇게 됩니다. 각 뉴런이 자기 줄만 봅니다.

r[t][1] = 1.0×( 0.5) + 0.5×( 0.1) + 0.2×(-0.4) =  0.47
           ↑h[t]의 1번  ↑h[t+1]의 1번 ↑h[t+2]의 1번

r[t][2] = 0.2×(-0.2) + 1.0×( 0.8) + 0.3×( 0.3) =  0.85
r[t][3] = 0.6×( 0.9) + 0.6×(-0.3) + 0.6×( 0.6) =  0.72

r[t][1]을 계산할 때 -0.2나 0.9(같은 시각의 다른 뉴런들)는 한 번도 등장하지 않습니다. 1번 뉴런의 값 세 개 0.5, 0.1, -0.4만 씁니다.

이게 "행"의 의미입니다 — 세로줄(같은 시각의 여러 뉴런)이 아니라 가로줄(한 뉴런의 시간 궤적) 방향으로만 계산합니다. 아래에서 직접 확인해 보세요.

데모 0 · 출력 한 칸은 어디서 왔는가
오른쪽 r에서 아무 칸이나 클릭하면 그 값을 만든 입력 칸들이 왼쪽에 표시됩니다.
입력 h (d=6 × T=10)
출력 r (d=6 × T=10) — 같은 모양
선택한 출력을 만든 입력 칸 선택한 출력 칸 흐린 칸 = 이 계산과 무관
쓰인 입력 칸 수3
그중 다른 채널에서0 개
출력 모양6 × 10
τ 슬라이더를 0으로 내려 보세요. 창이 [t, t] 한 칸으로 줄어들어 출력이 입력의 스칼라 배가 됩니다 — 사실상 아무 일도 안 하는 층이 되죠. τ가 이 층이 가진 유일한 "얼마나 볼 것인가" 손잡이입니다.

§2 W의 각 행은 그 채널의 시간축 필터다

여기가 이 층을 이해하는 열쇠입니다. 앞의 예제에서 세 행이 각각 무슨 일을 했는지 다시 보세요.

행가중치하는 일
W[1][1.0, 0.5, 0.2]현재 위주 + 미래를 감쇠시켜 조금 섞음 — 미래 흘끗 보기
W[2][0.2, 1.0, 0.3]다음 스텝을 제일 중시 — 신호를 시간축으로 한 칸 당겨옴
W[3][0.6, 0.6, 0.6]세 스텝 균등 평균 — 평활화(smoothing), 잡음 제거

배울 수 있는 게 더 있습니다.

가중치하는 일
[1.0, 0.0, 0.0]아무것도 안 함 (항등) — 이 층은 스스로를 끌 수 있습니다
[-1.0, 1.0, 0.0]미래 − 현재 = 변화율 감지. 소리가 바뀌는 순간을 잡아냄
[0.0, 0.0, 1.0]순수하게 두 스텝 미래로 이동

즉 행 합성곱은 채널마다 서로 다른 필터를 하나씩 배정한, d개의 독립적인 시간축 필터 뱅크입니다. 신호처리 용어로는 채널당 FIR 필터 하나씩이고요. 어떤 채널은 그냥 통과시키고, 어떤 채널은 미래로 밀고, 어떤 채널은 평균 내고, 어떤 채널은 미분합니다. 그걸 학습으로 알아서 정합니다.

데모 0-B · 필터 뱅크 놀이터
채널 3개에 서로 다른 필터를 걸어 봅니다. 연한 선이 입력, 진한 선이 출력입니다.

직접 가중치 만지기 — 채널 1

이 필터가 하는 일—
출력 지연 (무게중심)—
"미래 이동" 프리셋을 걸어 보세요. 출력 곡선이 입력보다 왼쪽으로 밀립니다 — 지금 시점에서 미래의 값을 미리 보고 있다는 뜻이죠. "변화율" 프리셋은 신호가 평평한 구간에서 0이 되고 꺾이는 지점에서만 튑니다. 이런 걸 채널 2,560개가 각자 알아서 고릅니다.

이 층이 못 하는 일 (제약이 곧 정체성)

그래서 이 층이 하는 일은 딱 하나로 압축됩니다 — 각 특징을 시간축 위에서 재분배하는 것. 만들지도, 섞지도 않고, 옮기고 뭉갤 뿐입니다.

다른 층들 사이에서의 좌표

층시간을 보나?채널을 섞나?파라미터
완전연결 (FC)✗✓d²
일반 1D 합성곱✓ (고정 창)✓d²(τ+1)
행 합성곱✓ (고정 창, 미래)✗d(τ+1)
RNN✓ (무제한, 과거)✓≈2d²

빈칸을 메우는 조합이 하나 있었고, 그게 행 합성곱입니다. 채널 혼합을 포기한 대가로 파라미터가 d²(τ+1)에서 d(τ+1)로 줄어듭니다 (§7에서 이 차이를 숫자로 봅니다).

§3 정의 — 왜 하필 "행" 합성곱인가 (식 11)

§1과 §2에서 손으로 한 계산을 이제 논문의 표기로 옮깁니다. 새로운 내용은 없고, 같은 것을 기호로 쓴 것뿐입니다.

마지막 순환층의 출력을 h_t ∈ R^d라 합시다 (d는 은닉 차원, 논문 배포 모델은 2560). 미래 컨텍스트 τ를 정하면 d × (τ+1) 크기의 특징 행렬 h_{t:t+τ} = [h_t, h_{t+1}, ..., h_{t+τ}]가 만들어집니다. 같은 크기의 파라미터 행렬 W를 두고, 새 층의 활성값은:

        τ+1
r[t,i] =  Σ   W[i,j] · h[t+j-1, i]        (1 ≤ i ≤ d)          ... 식 (11)
        j=1

여기서 결정적인 부분은 오른쪽 끝의 i입니다. W의 i번째 행이 h의 i번째 행하고만 곱해집니다. 논문이 이름을 붙인 이유가 그대로 여기 있습니다.

"Since the convolution-like operation in Eq. 11 is row oriented for both W and ht:t+τ, we call this layer row convolution."

즉 채널(행) 사이에는 어떤 정보도 오가지 않습니다. 각 채널이 자기 시간축 위에서만 τ+1개 스텝을 가중합할 뿐입니다. 현대 용어로 옮기면 정확히 depthwise 1D convolution이고, 창이 미래 쪽으로 나 있어서 lookahead convolution이라고도 부릅니다.

데모 3 · 식 (11)을 손으로 계산하기
왼쪽 W나 가운데 h의 아무 칸이나 클릭하면 그 행의 계산이 아래에 전개됩니다.
W (d × τ+1)
h — 마지막 순환층 출력 (d × T)
r[t] — 행 합성곱 출력
선택한 채널 — 이 행만으로 r[t,i]가 만들어진다 결과 r[t] 흐린 칸 = 이 계산에 전혀 쓰이지 않는 값
행이나 칸을 클릭해 보세요.
이 층의 파라미터 수18
한 출력당 곱셈 횟수3
"채널 혼합 허용" 버튼을 눌러 보세요. 일반적인 시간축 합성곱이라면 r[t,i]가 모든 채널의 모든 시각을 봐야 합니다. 전개식이 6개 항에서 36개 항으로 늘어나고, 파라미터도 d·(τ+1)에서 d²·(τ+1)로 뜁니다. §7에서 이 차이가 얼마나 큰지 봅니다.

왜 h_{t+1}을 쓰는 게 "미래를 보는 것"인가

한 가지 헷갈리기 쉬운 점. 행 합성곱은 미래의 원본 오디오 프레임을 보는 게 아닙니다. 미래 시점의 단방향 RNN 상태 h_{t+1}, h_{t+2}, …를 당겨 씁니다. 그런데 h_{t+τ}는 이미 "발화 시작부터 t+τ까지의 모든 과거"를 요약한 벡터죠. 따라서 r[t]가 실제로 보는 범위는:

r[t] 가 보는 것 =  [발화 시작 ... t+τ]  전 구간
                   └─ 과거 전체 (단방향 RNN이 이미 요약)
                              └─ 미래 τ 스텝 (행 합성곱이 당겨옴)

양방향 RNN이 보는 범위는 [발화 시작 … 발화 끝]입니다. 차이는 오직 오른쪽 끝을 어디서 자르느냐뿐입니다. 이게 "양방향성의 근사"라는 말의 정확한 의미입니다.

§4 그래서 왜? — 양방향 RNN은 "말이 끝나야" 시작한다

여기까지가 "무슨 연산인가"였습니다. 그런데 이쯤에서 당연한 의문이 듭니다 — 왜 이렇게 제약이 많은 층을 굳이 만들었을까? 채널도 못 섞고, 좁은 창밖에 못 보고, 과거도 못 보는데요.

답은 이 층이 정확도를 위해 만들어진 게 아니라 배포를 위해 만들어졌기 때문입니다. 논문 3.7절은 이 한 문장으로 시작합니다.

"Bidirectional RNN models are challenging to deploy in an online, low-latency setting, because they are built to operate on an entire sample, and so it is not possible to perform the transcription process as the utterance streams from the user."

양방향 RNN은 정방향 RNN과 역방향 RNN을 함께 돌립니다. 역방향 RNN의 시각 t 상태는 t+1의 상태에 의존하고, t+1은 t+2에… 결국 마지막 프레임까지 거슬러 올라가야 첫 계산이 가능합니다. 즉 발화 전체가 도착해야 어떤 시각의 출력도 낼 수 없습니다.

아래에서 직접 확인해 보세요. 같은 발화를 세 가지 구조가 처리할 때 글자가 언제 화면에 뜨는지를 나란히 놓은 것입니다.

데모 1 · 같은 발화, 세 구조의 첫 출력 시점
▶ 재생을 누르면 오디오가 실시간으로 흘러갑니다. 각 줄에서 글자가 언제 나타나는지 보세요.
이미 도착한 오디오 행 합성곱이 기다리는 미래 창 출력된 글자
단방향 — 첫 글자까지0 ms
행 합성곱 — 첫 글자까지760 ms
양방향 — 첫 글자까지5,000 ms
발화가 2배 길어지면—
핵심은 절대값이 아니라 증가율입니다. 발화 길이 슬라이더를 움직여 보세요. 행 합성곱의 지연은 τ·스텝으로 고정이고, 양방향의 지연은 발화 길이에 비례합니다. 10초를 말하든 60초를 말하든 행 합성곱은 똑같이 760ms 뒤에 첫 글자를 뱉습니다.

§5 왜 미래를 봐야 하는가 — 증거는 늦게 도착한다

그럼 애초에 왜 미래를 보고 싶어 하는 걸까요? 단방향으로 과거만 봐도 될 것 같은데요.

음성에서는 어떤 소리인지 판별할 증거가 그 소리보다 늦게 도착하는 일이 흔합니다. 대표적인 예가 파열음입니다. /t/와 /d/는 둘 다 혀끝으로 입천장을 막았다가 터뜨리는 소리라, 막고 있는 폐쇄 구간에서는 물리적으로 거의 동일한 무음입니다. 둘을 가르는 건 터뜨린 이후에 성대 진동이 얼마나 빨리 시작되느냐(유성 개시 시간, VOT)입니다. /d/는 거의 즉시, /t/는 수십 ms 뒤에 시작하죠. 즉 판별 증거가 40~80ms 미래에 있습니다.

아래는 이 상황을 단순화한 장난감 모형입니다. 프레임 오프셋마다 세 후보에 대한 "증거"가 조금씩 도착하고, 현재 시각의 예측은 lookahead 창 안에 들어온 증거만 합산해서 만들어집니다.

데모 2 · lookahead를 늘리면 예측이 언제 뒤집히는가
τ를 0부터 천천히 올려 보세요. 성급하게 답하면 틀립니다. 정답은 /t/입니다.
현재 예측?
정답과 일치?—
확신도 (최대 확률)33.3%
주의 — 이건 합성 예시입니다. DS2의 실제 활성값이 아니라 "판별 증거가 미래에 도착한다"는 현상만 떼어 보여주기 위해 손으로 만든 증거 행렬입니다. 숫자 자체는 논문에 없습니다. 반면 §6 이후의 τ·지연·파라미터 계산은 모두 논문에 명시된 값에서 나옵니다.

그런데 여기서 중요한 관찰이 하나 있습니다. τ를 8까지 올려도 예측이 크게 나아지지 않죠? 필요한 미래는 유한하고, 대체로 짧습니다. 논문의 표현으로는:

"The intuition behind this layer is that we only need a small portion of future information to make an accurate prediction at the current time-step."

발화가 끝날 때까지 기다리는 양방향 RNN은 이 관점에서 과잉입니다. 필요한 건 "무한한 미래"가 아니라 "충분한 미래"였던 거죠.

§6 τ와 지연 시간 — 발화 길이 vs 상수

논문의 배포 Mandarin 모델은 τ = 19를 씁니다 (7.4절). 그리고 7.3절에는 빔 서치 비용을 이야기하며 "per 40ms stride of speech data"라는 표현이 나옵니다 — 즉 이 시스템의 순환층 한 스텝이 오디오 40ms에 해당합니다. (스펙트로그램을 10ms 홉으로 뽑고 합성곱 층에서 시간축 스트라이드를 걸어 다운샘플링한 결과입니다. 3.6절 "Striding".)

그러면 실제 lookahead는:

τ × 스텝 = 19 × 40ms = 760ms

0.76초. 결코 "무시할 만한" 값은 아닙니다. 하지만 발화 길이와 무관한 상수라는 게 전부입니다.

데모 4 · 지연 예산 계산기
막대 길이가 "사용자가 첫 글자를 보기까지 기다리는 시간"입니다.
행 합성곱 lookahead760 ms
양방향 대기5,000 ms
몇 배 빠른가6.6×
30초 발화라면 격차39×
여기서 말하는 지연은 알고리즘적 지연(구조상 반드시 기다려야 하는 미래 오디오)입니다. 계산에 걸리는 시간은 별개인데, 논문은 그쪽도 보고합니다 — Batch Dispatch 스케줄러로 10개 동시 스트림에서 중앙값 44ms, 98퍼센타일 70ms의 계산 지연 (초록에서는 67ms로 언급). 즉 전체 체감 지연 ≈ 760ms(구조) + 수십 ms(계산)입니다.

§7 파라미터 — 채널을 섞었다면 어땠을까

행 합성곱이 채널을 섞지 않는 건 "우아해서"가 아니라 섞으면 감당이 안 되기 때문입니다.

데모 5 · depthwise(행) vs 채널 혼합(일반) 파라미터 비교
논문 배포 모델 값이 기본으로 들어 있습니다. 직접 바꿔 보세요.
파라미터 수비고
행 합성곱 (depthwise)51,200d · (τ+1)
채널 혼합 conv131,072,000d² · (τ+1)
참고: 순환층 5개65,536,0005 · 2d² — 배포 모델의 순환 스택 어림값
배율 (혼합 ÷ 행)2,560×
순환 스택 대비 혼합 conv2.00배

배율은 정확히 d입니다 — d²(τ+1) ÷ d(τ+1) = d. 논문 값에서는 2,560배죠. 절대값으로 보면 더 극적입니다. 채널을 섞는 conv 층 하나가 1억 3천만 개 파라미터로, 5층짜리 순환 스택 전체보다 큽니다. (순환 스택 값은 층당 W_xh + W_hh ≈ 2d²로 잡은 어림 계산입니다.)

그럴 만도 한 게, 채널 혼합은 이미 아래 순환층 다섯 개가 실컷 해 놨습니다. 맨 위에서 또 할 필요가 없는 거죠. 논문의 추측도 정확히 그겁니다.

"We conjecture that the recurrent layers have learned good feature representations, so the row convolution layer simply gathers the appropriate information to feed to the classifier."

§8 위치 — 왜 "모든 순환층 위"인가

논문은 배치 위치를 명시합니다.

"We place the row convolution layer above all recurrent layers. This has two advantages. First, this allows us to stream all computation below the row convolution layer on a finer granularity given little future context is needed. Second, this results in better CER compared to the best bidirectional model for Mandarin."

첫 번째 이점이 핵심입니다. 행 합성곱 아래쪽은 전부 완전한 인과(causal) 구조라 프레임이 하나 도착할 때마다 즉시 갱신할 수 있습니다. 미래를 기다리는 지점이 딱 한 군데, 맨 위뿐이죠.

만약 lookahead를 여러 층에 나눠 넣으면 어떻게 될까요? 지연이 층마다 누적됩니다. 각 층이 아래층 기준으로 τ만큼 미래를 보므로, L개 층이면 입력 기준 총 L·τ 프레임을 기다려야 합니다.

데모 6 · lookahead를 어디에 둘 것인가
층을 클릭해 lookahead 창을 켜고 끄세요. 총 지연이 어떻게 변하는지 보세요.
총 lookahead19 스텝
오디오 시간 (40ms/스텝)760 ms
DS2 방식 대비1.0×
두 번째 이점 — "better CER compared to the best bidirectional model" — 은 다음 절에서 다룹니다. "근사"가 "원본"보다 나았다는 뜻이라 그냥 지나치기 아까운 문장입니다.

§9 논문의 결과 — 근사가 원본을 이겼다

보통 "스트리밍을 위해 정확도를 조금 포기했다"는 이야기를 기대하게 됩니다. DS2의 Mandarin 시스템에서는 그렇지 않았습니다. 3.7절은 단방향 아키텍처가 양방향 모델만큼 잘 동작한다고 하고, 6절은 한 발 더 나갑니다 — 행 합성곱을 얹은 단방향 모델이 최고의 양방향 모델보다 CER이 더 낮았다고요.

왜 그럴 수 있을까요? 두 가지 해석이 가능합니다. 첫째, 짧은 미래로 충분한 과제였다면 무한한 미래는 이득이 없고 최적화만 어렵게 만듭니다. 둘째, 역방향 RNN이 학습해야 할 것을 τ+1개 가중치의 선형 결합으로 대체하면 파라미터가 줄고 학습이 쉬워집니다. 게다가 Mandarin은 초당 3.3자로 영어(14.1자)보다 훨씬 느려 시간축 압축과 짧은 lookahead에 유리합니다 (논문 각주 2).

배포 시스템 구성 (7.4절)

구성 요소값
순환층단방향(forward-only) 5개, 은닉 2560
행 합성곱1개, τ = 19
완전연결층1개, 2560
수치 정밀도16-bit
연구 시스템 CER5.81%
배포 시스템 CER6.10% (상대 5% 열화)
계산 지연 (10 스트림)중앙값 44ms · 98%ile 70ms

배포 CER이 조금 높은 건 행 합성곱 때문만은 아닙니다. 16비트 양자화, Batch Dispatch 배칭, 그리고 빔 서치 가지치기 휴리스틱(누적 확률 0.99까지·최대 40자 — Mandarin LM 조회를 150배 가속)이 함께 들어간 결과입니다.

§10 그 후 — depthwise conv와 스트리밍 ASR

행 합성곱은 2015년의 임시방편처럼 보이지만, 그 안의 두 아이디어는 지금도 표준입니다.

① 채널별(depthwise) 시간 합성곱

식 (11)은 오늘날의 Conv1d(channels, channels, kernel_size=τ+1, groups=channels)과 같습니다. PyTorch로 쓰면 이렇게 됩니다.

import torch.nn as nn
import torch.nn.functional as F

class RowConvolution(nn.Module):
    """DS2 식 (11). 채널 간 혼합 없음 — groups=d 가 그 역할."""
    def __init__(self, d, tau):
        super().__init__()
        self.tau = tau
        self.conv = nn.Conv1d(d, d, kernel_size=tau + 1,
                              groups=d, bias=False)   # ← depthwise

    def forward(self, h):            # h: (batch, d, T)
        # 미래 쪽으로만 tau 만큼 패딩 → 창이 [t, t+tau] 를 덮는다
        h = F.pad(h, (0, self.tau))  # (left=0, right=tau)
        return self.conv(h)          # (batch, d, T)

F.pad(h, (0, tau))에서 왼쪽 패딩이 0인 게 포인트입니다. 창이 오른쪽(미래)으로만 뻗습니다. 같은 층을 (tau, 0)으로 패딩하면 인과 합성곱(causal conv)이 되고, 이건 WaveNet 계열의 기본 부품입니다.

② "미래를 유한하게 자른다"는 발상

이 발상은 이후 스트리밍 음성 인식의 중심 설계 원리가 됩니다. 이름만 바뀔 뿐 구조는 같습니다.

기법미래를 자르는 방식
Row / Lookahead convolution (DS2)최상단 한 층에서 τ 스텝
Chunk-based / block-wise attention고정 길이 청크 단위로 잘라 청크 안에서만 양방향
RNN-T의 right context인코더에 제한된 미래 프레임만 허용
Conformer 스트리밍 변형attention 마스크로 미래 범위를 상수로 제한

전부 같은 트레이드오프 곡선 위에 있습니다. 미래를 많이 볼수록 정확하고, 그만큼 사용자가 기다립니다. 행 합성곱은 이 곡선에서 "채널을 섞지 않는다"는 제약으로 파라미터 비용을 거의 0으로 만든 지점입니다.

§11 정리 — 한 문장으로

행 합성곱 = 단방향 RNN 스택 맨 위에 얹는, 채널을 섞지 않는 τ 스텝짜리 미래 방향 depthwise 1D 합성곱.
"발화가 끝나야 시작"하는 양방향성을 "τ 프레임만 엿보기"로 대체해서, 지연을 발화 길이에 비례에서 상수로 바꾼다. 논문 배포 모델은 τ=19, 스텝 40ms → 760ms 고정. 파라미터는 d·(τ+1)로 채널 혼합 대비 d배(=2,560배) 저렴하고, Mandarin에서는 CER이 최고의 양방향 모델보다 오히려 낮았다.

처음 질문으로 돌아가 봅시다.

"DS2의 행 합성곱은 단방향 RNN 출력 위에 좁은 시각적 합성곱을 넣는다. 이렇게 하면 양방향성의 이점을 근사하면서도 스트리밍에 필요한 낮은 지연 시간을 유지할 수 있다."

이제 각 조각을 정확히 옮길 수 있습니다.

요약문의 표현정확한 의미
단방향 RNN 출력 위에모든 순환층 위, 분류기 아래에 딱 한 층 (3.7절)
좁은τ+1 = 20 스텝 — 발화 전체(수백~수천 스텝)에 비해 좁음
시각적 합성곱시간축(temporal) 합성곱의 번역 흔들림. 이미지 conv가 아니라 시간축 depthwise conv
양방향성의 이점을 근사"발화 끝까지의 미래"를 "τ 스텝의 미래"로 잘라냄
낮은 지연 시간발화 길이에 비례하던 대기가 상수 τ·스텝으로 바뀜

※ "시각적 합성곱"은 원문 row convolution이나 lookahead convolution의 번역으로는 부정확합니다. 아마 "시각(視覺)"이 아니라 "시각(時刻)" 즉 시간 방향을 뜻하려던 표현일 텐데, 어느 쪽이든 원문에 없는 말입니다.

§12 이해도 퀴즈