消息人士:美国已要求法国和德国释放应急柴油储备
Readhub
三名了解相关磋商的消息人士称,美国已要求法国和德国释放应急柴油储备,否则可能对欧洲实施柴油出口禁令,美方要求欧盟在未来六个月内释放 1.2 亿桶柴油储备。
Score: 57.19Confidence: 54%
View offerLoading the catalog…
THE AI OPPORTUNITY INDEX
Find your next AI tool. Explore free access, trials, and credits — all in one place.
Readhub
三名了解相关磋商的消息人士称,美国已要求法国和德国释放应急柴油储备,否则可能对欧洲实施柴油出口禁令,美方要求欧盟在未来六个月内释放 1.2 亿桶柴油储备。
Score: 57.19Confidence: 54%
View offerReadhub
国际能源署署长法提赫・比罗尔表示欧洲及其他地区柴油市场供应极度紧张,当前欧美柴油价格已触及历史高位,他对此十分担忧,油价上涨将在数月内推高农产品通胀,同时液化石油气价格也给非洲、印度等地带来麻烦。针对是否会新一轮释放战略储备的问题,比罗尔称将于周四晚些时候进一步表态。
Score: 57.17Confidence: 54%
View offervelog
Crypto.com provides digital-asset services through a range of products designed for users interested in managing cryptocurrencies and related financial activities. Because these services involve sensitive personal and financial information, account verification and security are important parts of responsible account management. When researching Verified Crypto.com Accounts, users should focus on creating and verifying their own accounts through official channels rather than obtaining accounts registered to another individual. Account Verification Verification helps establish the identity of the person using a financial or cryptocurrency service. Crypto.com may request personal information and identity documentation depending on the user's circumstances, location, and services being accessed. Users should provide accurate information that belongs to them and follow the verification instructions provided through official Crypto.com channels. Attempting to bypass identity requirements or using another person's information can create account-access and compliance issues. Important Features Depending on eligibility and availability, Crypto.com offers various features related to cryptocurrency management and digital-asset services. Available functionality can change over time and may differ by jurisdiction. Before using any particular feature, users should review the applicable requirements, fees, limitations, and terms. Understanding available features helps users make informed decisions and manage their accounts responsibly. Security Best Practices Security should remain a priority after verification is complete. Users should protect passwords, PINs, authentication codes, and other sensitive credentials. Where available, enable additional authentication and device-security features. Never share verification codes with another person, even if someone claims to represent customer support. Users should also keep their devices and applications updated. Security updates can address vulnerabilities and improve overall device protection. Avoid Phishing Attempts Cryptocurrency users are frequently targeted by phishing messages and fake websites. A suspicious message may request login credentials, verification codes, cryptocurrency
Score: 54.4Confidence: 49%
View offervelog
최근 AI 에이전트와 자동화 워크플로 분야에서는 단일 초거대 언어 모델(LLM)에 모든 판단과 생성을 의존하는 방식의 한계가 명확히 드러나고 있습니다. 복잡한 추론과 문장 작성을 잘하는 대형 모델을 정교한 조건 판정이나 단순 분기 선택에까지 매번 호출하면, 시스템 전체의 응답 지연 시간(Latency)이 크게 늘어나고 API 호출 비용이 기하급수적으로 증가하기 때문입니다. 이러한 문제를 해결하기 위해 텍스트 생성 기능을 배제하고 오직 상태 평가와 선택지 판단에만 특화된 판정 전용 AI 모델 을 기존 LLM의 앞뒤에 배치하는 이른바 '샌드위치 구조'가 새로운 대안으로 떠오르고 있습니다. 판정 전용 모델이 빠른 속도와 극히 낮은 비용으로 사전 검증과 동적 라우팅을 맡고, 실제 고난도 코드 작성 및 문맥 생성은 생성형 LLM이 담당하도록 역할을 분담함으로써 전체 시스템의 효율성을 극대화할 수 있습니다. The BEST Jev Use Cases for AI Coding (Absolute Game Changers) 판정 특화 모델 Jev의 메커니즘과 경제성 Jev 는 일반적인 LLM처럼 자유 형식의 문장을 생성하지 않고, 시스템의 상태(State) 정보와 객관식 질문 리스트를 입력받아 각 선택지에 대한 확률(신뢰도 점수)을 병렬로 산출하는 System 1 형태의 판정 전용 AI 모델입니다. 기존에는 Claude나 GPT 같은 생성형 LLM에 구조화된 출력(Structured Output)을 요구하여 판단을 내렸으나, 이러한 방식은 정규식 대비 정확도는 높지만 매번 높은 API 비용과 대기 시간이 발생하는 단점이 있었습니다. 반면 Jev는 판단 기능에만 집중하도록 훈련되어 있어 일반적인 초거대 LLM 대비 최대 200배 빠른 응답 속도를 제공하며 비용은 극히 일부분에 불과합니다. 따라서 에이전트가 코드를 수정하거나 외부 도구를 호출하기 직전, 매번 상태를 검증해야 하는 고빈도 판단 작업에 적합합니다. 다만 Jev는 문맥에 맞는 긴 텍스트를 직접 작성하지 못하므로, 전체 워크플로우를 Jev 단독으로 구성하기보다는 LLM과 역할을 분담하는 구조가 필수적입니다. 항목 기존 생성형 LLM (예: Claude 3.5 Haiku) 판정 특화 모델 (Jev) 주요 역할 텍스트/코드 생성, 복잡한 추론 상태 평가, 객관식 선택, 확률 판정 처리 속도 평균 1~2.5초 소요 평균 0.1 0.2초 (100 200ms) 소요 비용 효율 호출당 0.001달러 안팎 발생 호출당 0.00001달러 미만 (극소) 결합 방식 메인 작업 수행 (판단+생성) Pre-Hook, 라우터, 검증 검문소 역할 보안 훅과 실시간 게임 플레이테스팅 AI 코딩 에이전트가 위험한 셸 명령을 실행하거나 환경 변수( .env ) 파일의 비밀 키를 유출하는 문제를 방지하기 위해 Pre-Tool Hook 기반의 보안 가드레일이 사용됩니다. 정규식(Regex) 기반 훅은 처리 속도가 즉각적이고 비용이 들지 않지만, 파일 읽기 명령어의 수많은 변형( cat , python 스크립트, bash 파이프라인 등)을 완벽히 포착하지 못하고 정상적인 코드 작성 과정까지 차단하는 오탐(False Positive)이 자주 발생합니다. Jev를 보안 훅으로 도입하면 .env 유출 여부, 데이터 파괴 명령 여부, 에이전트의 탈선 여부 등을 개별 질문으로 분리하여 빠른 속도로 검증할 수 있습니다. # Jev 보안 가드레일(Jev Guard)에 전달되는 상태 및 질문 구조 예시 state = { "tool_name": "Bash", "tool_input": "cat .env", "working_dir": "/project/root" } questions = { "exposes_secret": { "instructions": "이 명령이 실제 비밀 키, API 토큰을 외부나 로그에 노출하는가?", "criteria": {"true": "실제 .env 파일 직접 조회", "false": "env.example 조회 또는 단순 파일명 언급"} }, "destroys_data": { "instructions": "이 명령이 프로젝트 폴더나 소스 코드를 비가역적으로 삭제하는가?" } } 벤치마크 테스트 결과, 48개의 위험 호출과 48개의 안전한 호출이 섞인 테스트 세트에서 정규식 훅은 위험 호출을 20개만 차단하고 안전한 호출을 19개나 오탐하여 차단했습니다. Claude 3.5 Haiku 는 46개를 차단했으나 응답에 1,440ms가 걸리고 0.0012달러의 비용이 발생했습니다. 반면 Jev는 47개의 위험 호출을 정확히 차단하고 오탐은 1건에 불과했으며, 처리 시간은 244ms, 비용은 0.00004달러에 불과했습니다. 실시간 응답이 필요한 게임 플레이테스팅 환경에서도 Jev의 속도가 발휘됩니다. 턴제 또는 실시간 게임을 진행할 때 LLM은 프레임별 상태를 분석하고 다음 행동을 결정하는 데 시간이 너무 오래 걸려 게임 진행이 불가능합니다. Jev를 사용하면 60fps/30fps 환경에서도 상태 데이터(플레이어 위치, 적 위치, 체력 등)를 받아 수백 밀리초 내에 공격, 회피, 이동 등의 행동을 선택할 수 있으며, 이 과정에서 발생한 버그 레포트를 추후 LLM이 수집하여 코드를 수정하는 방식으로 플레이테스팅을 자동화합니다. 브라우저 자동화 및 동적 워크플로우 라우팅 브라우저 테스트 환경에서 Playwright MCP 나 Agent Browser CLI 등을 사용할 때, LLM이 웹페이지의 모든 요소 클릭과 텍스트 입력을 직접 지시하면 지연 시간이 누적됩니다. Jev를 도입하면 웹애플리케이션(예: DynaChat ) 내의 텍스트 생성(폼 작성, 질문 답변 등)만 LLM에게 맡기고, "어떤 버튼을 누를 것인가", "어떤 탭으로 이동할 것인가"와 같은 단순 클릭 판단은 Jev가 약 100~200ms 만에 처리합니다. 이로 인해 브라우저 에이전트의 전체 동작 속도가 기존 대비 수 배 이상 향상됩니다. Jev는 GitHub Issue나 Pull Request가 들어왔을 때 작업의 성격을 분류하고 적절한 LLM 모델을 할당하는 동적 라우터 역할도 수행합니다. 단순 버그 수정이나 오타 수정 작업에는 비용이 저렴하고 속도가 빠른 모델(예: Claude 3.5 Haiku)을 배정하고, 복잡한 기능 설계나 구조 변경이 필요한 작업에는 고성능 모델(예: Claude 3.5 Sonnet 또는 Claude 3.5 Opus )을 배정하도록 라우팅합니다. [GitHub Issue / PR 입력] │ ▼ [Jev 라우터 (0.5초 / $0.0001)] ──► 작업 복잡도 및 유형 분류 (Bug vs Feature) │ ├─── (단순 작업) ──► [Haiku / 빠른 모델 실행] └─── (고난도 작업) ─► [Sonnet / Opus / 고성능 모델 실행] 오픈소스 워크플로우 빌더인 Archon 환경에서 GitHub 이슈 처리 12건과 PR 리뷰 16건을 대상으로 실험한 결과, Jev는 12건의 이슈 경로를 100% 정확하게 분류했으며 PR 리뷰 유형 분류에서도 16건 중 15건을 올바르게 라우팅했습니다. LLM을 라우터로 직접 사용했을 때는 호출당 0.03~0.32달러가 소요되었으나, Jev를 사용했을 때는 0.0001달러 수준으로 축소되었습니다. 정리 AI 에이전트의 성능과 경제성을 끌어올리기 위해서는 모든 처리를 고성능 LLM 단독으로 해결하려는 접근에서 벗어나야 합니다. 판정 특화 모델인 Jev를 시스템 전단과 후단에 배치하면 보안 가드레일 검증, 동적 라우팅, 브라우저 조작 같은 고빈도 선택 작업을 0.1~0.2초 내외의 빠른 속도와 극히 적은 비용으로 처리할 수 있습니다. 개발자는 에이전트의 PreToolUse 단계에 Jev 기반 보안 훅을 적용해 세션 안전성을 확보하는 한편, 작업 난이도에 따른 모델 분기 라우터를 구축함으로써 개발 프로세스 전반의 지연 시간과 API 비용을 대폭 줄이는 실질적인 최적화를 달성할 수 있습니다. 다룬 영상 The BEST Jev Use Cases for AI Coding (Absolute Game Changers) — Cole Medin · 17분
velog
4.2 LSTM과 GRU — 코드 리뷰 노트 노트북: 07-02. lstm_and_gru.ipynb (셀 9개, 코드 셀 7개) 예상 시간: 약 12분 (노트북 3분 + 추가 셀 9분) · 짝꿍 글: 4.2_LSTM과_GRU.md 발표 전 체크 노트북이 아주 짧다. 층을 만들어서 출력(repr)만 보는 셀뿐이고, 입력을 넣어 실행하는 셀이 없다. 그래서 이 노트에 세션에서 같이 돌려 볼 추가 셀 A~E 를 붙였다. 미리 코랩에 붙여 두자. ⚠️ 셀 5의 출력이 코드와 안 맞는다. 코드는 nn.LSTM(input_dim, hidden_size, ...) 이고 input_dim = 5 인데, 저장된 출력은 LSTM(8, 8, batch_first=True) 다. 작성자가 예전에 input_dim = 8 로 돌린 출력이 그대로 남은 것으로 보인다. 다시 실행하면 LSTM(5, 8, batch_first=True) 가 나온다. 4.1 노트북의 버그와 같은 교훈이라 짧게 짚고 가면 좋다. 셀 4와 셀 7은 똑같은 nn.RNN(...) 코드다. 비교용으로 일부러 둔 것이다. 흐름 한눈에 파트 셀 한 줄 메시지 시간 1. 노트북 0~8 만드는 법은 RNN과 똑같다. 이름만 바뀐다 3분 2. 추가 A — LSTM은 반환값이 (h_n, c_n) 튜플 2분 3. 추가 B — 파라미터 4배, 3배 2분 4. 추가 C — 수식 6줄 = nn.LSTM 3분 5. 추가 D — 기울기 실험 (시간 남으면) 2분 읽는 법: 🗣 = 그대로 말해도 되는 문장, ❓ = 나올 만한 질문과 답 Part 1. 노트북 (셀 0~8) 셀 0~1 — 임포트와 버전 import torch import torch.nn as nn torch.__version__ # '2.4.0+cu121' (노트북에 저장된 값) 버전 출력은 작성자 환경 값이다. 코랩에서 돌리면 다른 버전이 나와도 상관없다. 셀 2 — 크기 정하기 input_dim = 5 # 입력의 크기 hidden_size = 8 # 은닉 상태의 크기 4.1의 파이토치 파트와 같은 숫자다(입력 5, 은닉 8). 4.1의 결과와 바로 비교할 수 있다. 셀 4~5 — RNN과 LSTM 나란히 만들기 nn.RNN(input_dim, hidden_size, batch_first=True) # → RNN(5, 8, batch_first=True) nn.LSTM(input_dim, hidden_size, batch_first=True) # → LSTM(8, 8, batch_first=True) ← 저장된 출력이 이상하다 두 줄이 클래스 이름만 다르고 인자는 완전히 같다. 바깥에서 쓰는 법은 RNN과 같고, 셀 안쪽만 다르다는 게 이 셀의 메시지다. 변수에 담지 않았으니 층을 만들기만 하고 버린다. 주피터가 마지막 줄의 값을 보여주니까 층의 요약(repr) 이 출력된다. 출력은 (입력 크기, 은닉 크기, 옵션) 순서다. 셀 5의 저장된 출력 LSTM(8, 8, ...) 은 지금 코드로 나올 수 없는 값 이다. 다시 실행하면 LSTM(5, 8, ...) 이 나온다. 🗣 "RNN을 LSTM으로 바꾸는 건 이름 한 단어만 바꾸면 돼요. 4.5에서도 모델 코드에서 nn.LSTM 한 줄이 이 자리에 들어갑니다." 🗣 "셀 5 출력을 보면 LSTM(8, 8)이라고 찍혀 있는데, 코드는 input_dim이 5예요. 예전에 돌린 출력이 남아 있는 거고, 다시 돌리면 5가 나옵니다. 4.1에서도 봤지만, 저장된 출력은 '언젠가 돌린 결과'일 뿐이라 그대로 믿으면 안 돼요." 셀 7~8 — RNN과 GRU 나란히 만들기 nn.RNN(input_dim, hidden_size, batch_first=True) # → RNN(5, 8, batch_first=True) nn.GRU(input_dim, hidden_size, batch_first=True) # → GRU(5, 8, batch_first=True) 이번에도 이름만 다르다. GRU는 출력이 정상( 5, 8 )이다. ❓ 만드는 법이 다 같으면 뭐가 달라? 안에 든 가중치 수와 계산 순서가 다르다. 그리고 LSTM만 반환값 모양이 다르다. 추가 셀 A, B에서 바로 확인한다. Part 2. 추가 셀 A — 실행해서 반환값 보기 x = torch.randn(1, 10, 5) # (배치, 시점, 입력 차원) rnn = nn.RNN(5, 8, batch_first=True) lstm = nn.LSTM(5, 8, batch_first=True) gru = nn.GRU(5, 8, batch_first=True) out_r, h_r = rnn(x) out_l, (h_l, c_l) = lstm(x) # ← LSTM만 튜플로 받는다 out_g, h_g = gru(x) print(out_r.shape, h_r.shape) # [1, 10, 8] [1, 1, 8] print(out_l.shape, h_l.shape, c_l.shape) # [1, 10, 8] [1, 1, 8] [1, 1, 8] print(out_g.shape, h_g.shape) # [1, 10, 8] [1, 1, 8] outputs 모양은 셋 다 (1, 10, 8) 로 같다. LSTM은 두 번째 반환값이 (h_n, c_n) 튜플 이다. c_n 이 마지막 시점의 셀 상태 다. outputs 에는 $h_t$만 담긴다. 셀 상태는 셀 안에서만 흐르고, 마지막 값만 c_n 으로 꺼내 준다. 일부러 틀려 보기: outputs, _status = lstm(x) # 4.1처럼 받으면 print(_status.shape) # AttributeError: 'tuple' object has no attribute 'shape' 🗣 "4.1 습관대로 outputs, _status 로 받으면 _status가 튜플이라 shape에서 에러가 나요. LSTM은 꼭 괄호로 풀어서 받습니다. 4.5 모델 코드도 lstm_out, (hidden, cell) = self.lstm(embedded) 로 되어 있어요." ❓ 4.5에서는 뭘 써? hidden.squeeze(0) . (1, 배치, 128) 에서 층 차원 1을 없애 (배치, 128) 로 만들고 fc층에 넣는다. 다 대 일이라 마지막 은닉 상태 하나만 쓴다. Part 3. 추가 셀 B — 파라미터 세어 보기 for m in [rnn, lstm, gru]: print(type(m).__name__, sum(p.numel() for p in m.parameters())) for name, p in m.named_parameters(): print(' ', name, tuple(p.shape)) RNN 120 weight_ih_l0 (8, 5) weight_hh_l0 (8, 8) ... LSTM 480 weight_ih_l0 (32, 5) weight_hh_l0 (32, 8) ... GRU 360 weight_ih_l0 (24, 5) weight_hh_l0 (24, 8) ... RNN의 가중치 행 수는 8, LSTM은 32 = 8 × 4 , GRU는 24 = 8 × 3 이다. LSTM은 $f, i, g, o$ 네 개의 가중치를 한 행렬에 세로로 쌓아 둔다. 순서는 i, f, g, o 다. 행렬곱 한 번으로 넷을 같이 계산하고, 나중에 8칸씩 자른다. GRU는 r, z, g 세 벌이다. 🗣 "파라미터가 정확히 4배, 3배인 건 게이트마다 4.1의 RNN 셀이 하나씩 들어 있다고 보면 돼요. 게이트 하나가 RNN 셀 하나랑 같은 모양의 식이거든요." ❓ LSTM의 첫 8행만 꺼내면 뭐야? lstm.weight_ih_l0[:8] 이 입력 게이트 $i$의 $W_{xi}$ (8, 5) 다. [8:16] 은 삭제 게이트 $f$다. Part 4. 추가 셀 C — 수식 6줄로 nn.LSTM 재현하기 W_ih, W_hh = lstm.weight_ih_l0, lstm.weight_hh_l0 b_ih, b_hh = lstm.bias_ih_l0, lstm.bias_hh_l0 h = torch.zeros(1, 8) # h_0 c = torch.zeros(1, 8) # C_0 outs = [] for t in range(10): z = x[:, t] @ W_ih.T + b_ih + h @ W_hh.T + b_hh # (1, 32) 네 게이트를 한 번에 i, f, g, o = z.chunk(4, dim=1) # 8칸씩 넷으로 (순서 i, f, g, o) i, f, g, o = torch.sigmoid(i), torch.sigmoid(f), torch.tanh(g), torch.sigmoid(o) c = f * c + i * g # 셀 상태 h = o * torch.tanh(c) # 은닉 상태 outs.append(h) print(torch.allclose(torch.stack(outs, 1), out_l, atol=1e-6)) # True print(torch.allclose(c, c_l[0], atol=1e-6)) # True 한 줄씩: z = ... → 4.1의 RNN 셀 계산과 똑같은 모양이다. 다만 결과가 8칸이 아니라 32칸 이다(게이트 넷 몫). z.chunk(4, dim=1) → 32칸을 8칸씩 넷으로 자른다. 순서가 i, f, g, o인 걸 꼭 짚자. 활성화 → 게이트 셋(i, f, o)은 시그모이드 (0 1 밸브), 후보 g는 tanh (-1 1 내용). c = f * c + i * g → 셀 상태 갱신. 이번 편의 핵심 줄. * 는 원소별 곱이다. h = o * torch.tanh(c) → 셀 상태를 다듬어서 필요한 만큼 꺼낸다. 🗣 "4.1에서 RNN은 for문 안에 한 줄이었죠. LSTM은 이 여섯 줄이고, 그중 진짜 새로운 건 c = f * c + i * g 한 줄이에요. 곱셈 한 번, 덧셈 한 번으로만 기억이 바뀌니까 기울기가 멀리까지 갈 수 있습니다." ❓ GRU도 이렇게 재현돼? 된다. 다만 파이토치 GRU는 리셋 게이트를 곱하는 위치가 위키독스 수식과 다르다. 위키독스는 $W_{hg}(r \odot h)$이고, 파이토치는 $r \odot (W_{hg}h + b)$다. 위키독스 수식 그대로 짜면 nn.GRU 와 값이 다르게 나온다(직접 확인함). 학습 성능 차이는 거의 없다. Part 5. 추가 셀 D — 기울기가 얼마나 멀리 가나 (시간 남으면) def grad_by_distance(model, T=60): x = torch.randn(1, T, 5, requires_grad=True) out = model(x)[0] out[:, -1].sum().backward() # 마지막 출력에서 역전파 return x.grad[0].norm(dim=1).flip(0) # [0칸 앞, 1칸 앞, ...] torch.manual_seed(0) rnn, lstm = nn.RNN(5, 8, batch_first=True), nn.LSTM(5, 8, batch_first=True) lstm_open = nn.LSTM(5, 8, batch_first=True) with torch.no_grad(): lstm_open.bias_ih_l0[8:16] = 3.0 # 삭제 게이트 f의 편향만 3으로 → f ≈ 0.95 for name, m in [('RNN', rnn), ('LSTM', lstm), ('LSTM f≈0.95', lstm_open)]: g = grad_by_distance(m) print(name, [f'{g[k]:.0e}' for k in (0, 10, 30, 59)]) 결과 경향(시드 20개 평균, 글의 그래프와 같음): 0칸 10칸 30칸 59칸 RNN 1e+00 1e-03 2e-07 2e-11 LSTM (초기값) 3e-01 1e-03 6e-07 9e-11 LSTM (f ≈ 0.95) 2e-01 6e-02 3e-02 2e-02 bias_ih_l0[8:16] → 32칸 중 두 번째 8칸, 즉 삭제 게이트 $f$ 의 편향이다(순서 i, f , g, o). 시드 하나로 돌리면 숫자는 꽤 달라진다(예: 시드 1에서 RNN 59칸은 3e-21). 하지만 "RNN과 초기 LSTM은 계속 작아지고, f ≈ 0.95인 LSTM만 버틴다"는 경향은 같다. 🗣 "초기값 그대로의 LSTM은 RNN이랑 똑같이 기울기가 사라져요. 학습 전에는 f가 0.5 근처라서 매 시점 기억이 반씩 줄거든요. f를 0.95로 열어 주면 60칸 앞까지 기울기가 살아 있습니다." 🗣 "그러니까 LSTM이 기울기 소실을 공짜로 없애 주는 게 아니에요. 기울기가 지나갈 길을 만들어 두고, 그 길을 열지 말지를 학습하게 한 겁니다." ❓ 그럼 4.5에서도 편향을 바꿔야 해? 안 바꾼다. 학습하면서 필요한 칸의 $f$가 알아서 올라간다. 처음부터 1 정도로 잡아 두는 경우도 있지만 필수는 아니다. 마무리 (1분) 🗣 "LSTM과 GRU는 바깥에서 쓰는 법이 RNN과 거의 같아요. 다른 점은 셋입니다. 첫째, LSTM은 반환값이 outputs, (h_n, c_n) 튜플이에요. 둘째, 파라미터가 4배, 3배예요. 셋째, 안에서 게이트가 기억을 얼마나 지우고 넣을지 조절합니다. 4.5 모델 코드에서 nn.LSTM 한 줄과 (hidden, cell)로 받는 부분이 오늘 본 그대로 나옵니다." 치트시트 (입력 (1, 10, 5) , hidden_size=8 ) 받는 법 outputs 마지막 상태 파라미터 가중치 순서 nn.RNN out, h_n (1, 10, 8) h_n (1, 1, 8) 120 — nn.LSTM out, (h_n, c_n) (1, 10, 8) h_n , c_n 각 (1, 1, 8) 480 i, f, g, o nn.GRU out, h_n (1, 10, 8) h_n (1, 1, 8) 360 r, z, g
velog
4.2 LSTM과 GRU 딥러닝 스터디 4차 세션 과제 | 위키독스 「07-02 LSTM과 GRU」 들어가며 4.1은 이렇게 끝났다. 역전파가 시간을 거슬러 갈 때 같은 $W_h$와 tanh 미분을 시점 수만큼 반복해서 곱하기 때문에, 문장이 길어지면 앞쪽 단어까지 기울기가 거의 닿지 않는다. 이번 편은 그 문제를 고친 두 셀, LSTM 과 GRU 를 다룬다. 결론부터 말하면 둘 다 바깥 모양은 4.1의 RNN과 같다. 입력 (배치, 시점, 차원) 을 넣으면 outputs 와 마지막 상태가 나온다. 바뀌는 건 셀 안쪽뿐 이다. 1. 바닐라 RNN의 한계 — 장기 의존성 4.1의 기본 RNN을 LSTM과 구분해서 바닐라(vanilla) RNN 이라고 부른다. 바닐라 RNN은 짧은 시퀀스 에서만 잘 동작한다. 나는 프랑스에서 태어나 열다섯 살까지 그곳에서 자랐다. 그 뒤 한국으로 이사 와서 대학을 다녔고, 지금은 서울에서 개발자로 일한다. 그래서 나는 ___ 를 유창하게 한다. 빈칸에는 "프랑스어"가 들어가야 한다. 그런데 결정적인 단서인 "프랑스"는 수십 단어 앞 에 있다. 바닐라 RNN의 은닉 상태는 매 시점 $W_h$와 tanh를 거치며 덮어써진다. 그래서 그 사이에 앞쪽 정보가 거의 지워진다. 이렇게 필요한 정보가 멀리 떨어져 있어서 생기는 문제 를 장기 의존성 문제(the problem of long-term dependencies) 라고 한다. 학습 쪽에서 보면 같은 문제다. 마지막 시점의 손실에서 앞쪽 입력까지 기울기가 가려면, $W_h$를 곱하고 tanh 미분(최대 1)을 곱하는 일을 시점 수만큼 반복 해야 한다. 3.6에서 층을 깊게 쌓을 때 본 기울기 소실이, 여기서는 시간 방향으로 일어난다. 4절에서 직접 재 본다. 2. LSTM의 아이디어 — 기억을 두 줄로 나눈다 LSTM(Long Short-Term Memory) 은 기억을 두 줄로 들고 간다. 이름 역할 $C_t$ 셀 상태(cell state) 장기 기억. 시점을 지나며 곱셈 한 번(삭제)과 덧셈 한 번(추가)만 거친다 $h_t$ 은닉 상태(hidden state) 단기 기억. 셀 상태를 다듬어 꺼낸 값. 출력이자 다음 시점의 입력 셀 상태는 컨베이어 벨트 처럼 생각하면 된다. 벨트는 그냥 흘러가고, 중간중간 게이트 가 "무엇을 지울지", "무엇을 올릴지", "무엇을 꺼내 보일지"만 조절한다. 게이트 = 0~1 사이의 밸브 게이트는 시그모이드(σ) 를 거친 값이라 0~1 사이다. 이 값을 다른 벡터에 원소별로 곱한다. 1에 가까우면 → 거의 다 통과 0에 가까우면 → 거의 다 막힘 원소별 곱은 $\odot$로 쓴다(위키독스는 $\circ$로 쓴다). 2.4 소프트맥스에서 본 행렬곱이 아니라, 같은 위치끼리 곱하는 것이다. 파이토치에서는 그냥 * 다. 3. LSTM의 수식 — 게이트 네 개 네 개 모두 4.1과 같은 모양이다 먼저 공통점부터 보자. LSTM 안의 값 네 개는 전부 4.1의 RNN 셀과 같은 식 이다. $$\text{(활성화)}(W_{x\square}, x_t + W_{h\square}, h_{t-1} + b_\square)$$ 지금 입력과 직전 은닉 상태를 각자의 가중치로 곱해서 더한다. 다른 건 가중치 세트가 네 벌 이라는 것과 활성화 함수 뿐이다. 기호 이름 활성화 범위 하는 일 $f_t$ 삭제 게이트 (forget) σ 0 ~ 1 이전 셀 상태를 얼마나 남길지 $i_t$ 입력 게이트 (input) σ 0 ~ 1 새 후보를 얼마나 넣을지 $g_t$ 후보 (candidate) tanh -1 ~ 1 넣을 내용 자체. 4.1의 $h_t$ 계산과 똑같다 $o_t$ 출력 게이트 (output) σ 0 ~ 1 셀 상태를 얼마나 꺼내 보일지 $$f_t = \sigma(W_{xf}x_t + W_{hf}h_{t-1} + b_f)$$ $$i_t = \sigma(W_{xi}x_t + W_{hi}h_{t-1} + b_i)$$ $$g_t = \tanh(W_{xg}x_t + W_{hg}h_{t-1} + b_g)$$ $$o_t = \sigma(W_{xo}x_t + W_{ho}h_{t-1} + b_o)$$ 💡 $g_t$의 식은 4.1 바닐라 RNN의 $h_t$ 식과 완전히 같다. 바닐라 RNN은 이 값을 그대로 새 기억으로 썼다. LSTM은 이 값을 후보 로만 두고, 게이트로 얼마나 반영할지 정한다. 셀 상태 갱신 — 핵심은 덧셈 $$C_t = f_t \odot C_{t-1} + i_t \odot g_t$$ 앞 항 $f_t \odot C_{t-1}$: 이전 장기 기억 중 남길 만큼만 남긴다. 뒤 항 $i_t \odot g_t$: 새 후보 중 넣을 만큼만 넣는다. 그리고 둘을 더한다. 게이트 값이 극단적일 때를 보면 의미가 분명해진다. $f_t$ $i_t$ $C_t$ 뜻 1 0 $C_{t-1}$ 이번 단어는 무시하고 기억을 그대로 유지 0 1 $g_t$ 과거를 지우고 새로 씀 1 1 $C_{t-1} + g_t$ 과거를 유지하면서 새 내용을 추가 0 0 0 다 비움 첫 줄이 장기 기억의 비결이다. 1절의 문장이라면 "프랑스"를 읽을 때 그 정보를 셀 상태에 넣는다. 그 뒤 상관없는 단어들에서는 $f \approx 1, i \approx 0$으로 그대로 실어 나르면 된다. 바닐라 RNN에는 이렇게 "건드리지 않고 넘기는" 길이 없었다. 은닉 상태 — 셀 상태에서 꺼내 보이기 $$h_t = o_t \odot \tanh(C_t)$$ 셀 상태를 tanh로 -1~1 사이로 다듬는다. 그다음 출력 게이트로 지금 필요한 부분만 꺼낸다. 이 $h_t$가 그 시점의 출력이고, 다음 시점 네 게이트의 입력이다. 📌 위키독스에는 이 식이 $h_t = o_t \circ \tanh(c_t)$로 소문자 $c_t$로 적혀 있다. 셀 상태 $C_t$와 같은 것이다. 한 시점을 코드로 쓰면 f = torch.sigmoid(x_t @ Wxf.T + h @ Whf.T + bf) # 삭제 게이트 i = torch.sigmoid(x_t @ Wxi.T + h @ Whi.T + bi) # 입력 게이트 g = torch.tanh( x_t @ Wxg.T + h @ Whg.T + bg) # 후보 o = torch.sigmoid(x_t @ Wxo.T + h @ Who.T + bo) # 출력 게이트 c = f * c + i * g # 셀 상태: 곱셈 한 번, 덧셈 한 번 h = o * torch.tanh(c) # 은닉 상태 4.1의 반복문에서 한 줄이던 것이 여섯 줄이 됐다. 그래도 위 네 줄은 같은 모양의 반복 이다. 4. 왜 LSTM은 기울기가 덜 사라지나 셀 상태 길의 미분 셀 상태 식 $C_t = f_t \odot C_{t-1} + i_t \odot g_t$를 $C_{t-1}$로 미분하면, 직접 경로에서는 $$\frac{\partial C_t}{\partial C_{t-1}} = f_t \quad(\text{원소별})$$ 바닐라 RNN은 한 시점 거슬러 갈 때마다 행렬 $W_h$와 tanh 미분 을 곱했다. LSTM의 셀 상태 길은 삭제 게이트 값 $f_t$만 곱한다. $f_t$가 1에 가까우면 기울기가 거의 줄지 않고 앞으로 전달된다. 직접 재 보기 길이 60짜리 시퀀스를 넣었다. 그리고 마지막 출력의 기울기가 각 시점의 입력까지 얼마나 닿는지 재 봤다. 학습 전 무작위 가중치이고, 시드 20개의 평균이다. x = torch.randn(1, 60, 5, requires_grad=True) out = model(x)[0] out[:, -1].sum().backward() # 마지막 시점 출력에서 역전파 x.grad[0].norm(dim=1) # 시점마다 입력에 도착한 기울기 크기 모델 바로 앞 (0칸) 10칸 앞 30칸 앞 59칸 앞 바닐라 RNN 9.8e-01 1.2e-03 1.8e-07 1.7e-11 LSTM (초기값 그대로) 2.6e-01 1.3e-03 6.4e-07 8.5e-11 LSTM (삭제 게이트 f ≈ 0.95) 2.3e-01 6.3e-02 2.7e-02 2.2e-02 여기서 중요한 관찰이 하나 있다. 초기값 그대로의 LSTM은 바닐라 RNN만큼 빠르게 사라진다. 파이토치는 게이트 편향을 0 근처로 초기화한다. 그래서 학습 전에는 $f_t \approx \sigma(0) = 0.5$이고, 매 시점 기억이 절반씩 줄어든다. 삭제 게이트의 편향을 3으로 바꿔서 $f_t \approx \sigma(3) \approx 0.95$로 만들면 이야기가 달라진다. 60칸 앞까지 기울기가 거의 그대로 남는다. 즉 LSTM은 기울기 소실을 자동으로 없애 주는 게 아니다. 기울기가 지나갈 수 있는 길(셀 상태)을 만들어 두고, 그 길을 열지 말지($f_t$)를 학습하게 한 것 이다. 오래 기억해야 하는 정보가 있으면, 학습하면서 해당 칸의 $f_t$가 1 가까이 올라간다. 💡 그래서 실무에서는 삭제 게이트 편향을 처음부터 1 정도로 크게 잡아 두는 경우도 있다. "처음엔 일단 다 기억해 두고, 필요 없는 걸 지우는 법을 배워라"라는 뜻이다. 이 스터디의 4.5에서는 따로 건드리지 않는다. 5. 파이토치 nn.LSTM 사용법 — nn.RNN 과 거의 같다 lstm = nn.LSTM(input_size=5, hidden_size=8, batch_first=True) inputs = torch.randn(1, 10, 5) outputs, (h_n, c_n) = lstm(inputs) print(outputs.shape) # torch.Size([1, 10, 8]) print(h_n.shape) # torch.Size([1, 1, 8]) print(c_n.shape) # torch.Size([1, 1, 8]) 4.1과 다른 점은 반환값의 두 번째 자리가 튜플 이라는 것 하나다. 반환값 shape 뜻 outputs (배치, 시점, 은닉) 모든 시점의 $h_t$. 4.1과 같다 h_n (층 × 방향, 배치, 은닉) 마지막 시점의 $h_t$. 4.1의 _status 와 같다 c_n (층 × 방향, 배치, 은닉) 마지막 시점의 셀 상태 $C_t$ . LSTM에만 있다 ⚠️ outputs, _status = lstm(inputs) 로 받으면 _status 가 텐서가 아니라 튜플 (h_n, c_n) 이 된다. _status.shape 를 찍으면 에러가 난다. LSTM은 꼭 outputs, (h_n, c_n) 으로 풀어서 받자. outputs 에는 $h_t$만 담기고 $C_t$는 담기지 않는다. 셀 상태는 셀 안에서만 흐르는 기억 이고, 바깥으로 보이는 건 은닉 상태다. 마지막 셀 상태만 c_n 으로 따로 꺼내 준다. 층 하나에 단방향이면 4.1처럼 outputs[:, -1] 과 h_n[0] 이 같다. 4.5의 리뷰 분류 모델도 이 값을 쓴다. lstm_out, (hidden, cell) = self.lstm(embedded) 로 받고, hidden.squeeze(0) 으로 (1, 배치, 은닉) 의 맨 앞 1을 없앤 뒤 fc층에 넣는다. 층이 여러 개라면 hidden[-1] (마지막 층)을 쓰면 된다. 파라미터 — 정확히 4배 for name, p in lstm.named_parameters(): print(name, tuple(p.shape)) weight_ih_l0 (32, 5) ← W_x 네 개를 세로로 쌓은 것 (8 × 4 = 32) weight_hh_l0 (32, 8) ← W_h 네 개 bias_ih_l0 (32,) bias_hh_l0 (32,) $$4 \times (8 \times 5 + 8 \times 8 + 8 + 8) = 4 \times 120 = 480$$ 게이트 네 개의 가중치를 따로 두지 않고 한 행렬에 세로로 쌓아 둔다. 행렬곱 한 번으로 네 개를 한꺼번에 계산한 뒤 넷으로 자른다. 쌓인 순서는 i, f, g, o 다. 수식대로 직접 계산해서 비교 z = x_t @ lstm.weight_ih_l0.T + lstm.bias_ih_l0 + h @ lstm.weight_hh_l0.T + lstm.bias_hh_l0 i, f, g, o = z.chunk(4, dim=1) # 32칸을 8칸씩 넷으로 자른다 (순서 i, f, g, o) i, f, g, o = torch.sigmoid(i), torch.sigmoid(f), torch.tanh(g), torch.sigmoid(o) c = f * c + i * g h = o * torch.tanh(c) 이걸 10시점 반복하면 outputs , c_n 과 정확히 같다( torch.allclose → True ). 3절의 수식이 그대로 nn.LSTM 안에 들어 있다. 6. GRU — 게이트를 두 개로 줄인 LSTM GRU(Gated Recurrent Unit) 는 2014년에 나왔다. LSTM의 아이디어는 살리면서 구조를 줄였다. 셀 상태가 없다. 은닉 상태 $h_t$ 하나가 장기·단기 기억을 다 맡는다. 게이트가 두 개 다. 리셋 게이트 $r_t$, 업데이트 게이트 $z_t$. 수식 $$r_t = \sigma(W_{xr}x_t + W_{hr}h_{t-1} + b_r)$$ $$z_t = \sigma(W_{xz}x_t + W_{hz}h_{t-1} + b_z)$$ $$g_t = \tanh(W_{hg}(r_t \odot h_{t-1}) + W_{xg}x_t + b_g)$$ $$h_t = (1 - z_t) \odot g_t + z_t \odot h_{t-1}$$ 업데이트 게이트 $z_t$ — 과거와 새것의 비율 마지막 식이 GRU의 핵심이다. $z_t$와 $1 - z_t$는 더하면 1 이다. 그래서 $h_t$는 과거 $h_{t-1}$과 새 후보 $g_t$를 $z_t$ 비율로 섞은 것 이 된다. $z_t$ $h_t$ 뜻 1 $h_{t-1}$ 과거를 그대로 유지 (LSTM의 $f=1, i=0$) 0 $g_t$ 새것으로 교체 (LSTM의 $f=0, i=1$) 0.5 반반 섞는다 LSTM은 삭제($f$)와 입력($i$)을 따로 정했다. GRU는 "남기는 만큼 덜 넣는다"로 하나로 묶었다. 그래서 게이트가 하나 줄었다. 리셋 게이트 $r_t$ — 후보를 만들 때 과거를 얼마나 볼지 후보 $g_t$를 만들 때 직전 은닉 상태에 $r_t$를 곱해서 넣는다. $r_t \approx 0$이면 과거를 무시하고 지금 입력만으로 후보를 만든다. 문장이 새 주제로 넘어갈 때처럼 "앞 내용과 상관없이 새로 시작"하는 데 쓰인다. 📌 파이토치의 GRU는 리셋 게이트를 곱하는 위치가 조금 다르다. 위키독스(원 논문 방식)는 $W_{hg}(r_t \odot h_{t-1})$로 곱하기 전에 $r_t$를 곱한다. 파이토치는 $r_t \odot (W_{hg}h_{t-1} + b_{hg})$로 곱한 뒤에 곱한다. 계산이 빨라서 이렇게 하는 구현이 많다. 직접 계산해 보면 두 방식의 결과는 다르다. 하지만 학습하면 성능은 거의 같다. 파이토치 GRU를 수식으로 따라가 볼 때만 주의하면 된다. 7. 파이토치 nn.GRU gru = nn.GRU(input_size=5, hidden_size=8, batch_first=True) outputs, h_n = gru(inputs) print(outputs.shape) # torch.Size([1, 10, 8]) print(h_n.shape) # torch.Size([1, 1, 8]) 셀 상태가 없으니 반환값은 4.1의 nn.RNN 과 똑같은 모양 이다. 튜플이 아니라 텐서 하나다. 파라미터는 3배다. 가중치가 r, z, g 세 벌이고, 이 순서로 쌓여 있다. weight_ih_l0 (24, 5) ← 8 × 3 weight_hh_l0 (24, 8) bias_ih_l0 (24,) bias_hh_l0 (24,) $$3 \times 120 = 360$$ 8. 셋 비교 바닐라 RNN LSTM GRU 기억 $h$ $h$(단기) + $C$(장기) $h$ 게이트 없음 3개 (f, i, o) + 후보 g 2개 (r, z) + 후보 g 기억 갱신 매번 덮어씀 $f \odot C + i \odot g$ $(1-z) \odot g + z \odot h$ 가중치 세트 1벌 4벌 3벌 파라미터 ($d$=5, $D_h$=8) 120 480 360 반환값 outputs, h_n outputs, (h_n, c_n) outputs, h_n 긴 시퀀스 약함 강함 강함 무엇을 쓸까? 둘 다 바닐라 RNN보다는 확실히 낫고, 둘 사이의 성능 차이는 문제마다 다르다. 흔히 쓰이는 경험칙은 다음과 같다. GRU: 파라미터가 적어서 빠르다. 데이터가 적을 때 유리한 편이다. LSTM: 데이터가 많을 때 유리한 편이다. 4.5의 네이버 영화 리뷰 분류는 LSTM 을 쓴다. 정리 개념 한 줄 장기 의존성 필요한 정보가 멀리 있으면 바닐라 RNN은 잊는다 (시간 방향 기울기 소실) 셀 상태 $C_t$ LSTM의 장기 기억. 곱셈 한 번 + 덧셈 한 번으로만 갱신 게이트 σ로 만든 0~1 밸브. 원소별로 곱해 통과량을 조절 LSTM 게이트 삭제 $f$, 입력 $i$, 출력 $o$ + 후보 $g$ 셀 상태 식 $C_t = f_t \odot C_{t-1} + i_t \odot g_t$ 은닉 상태 식 $h_t = o_t \odot \tanh(C_t)$ 기울기 셀 상태 길은 $f_t$만 곱한다 → $f \approx 1$이면 멀리까지 전달. 단, 그 값은 학습으로 정해진다 GRU 셀 상태 없음, 게이트 2개. $h_t = (1-z_t) \odot g_t + z_t \odot h_{t-1}$ nn.LSTM outputs, (h_n, c_n) . 파라미터 4배, 순서 i·f·g·o nn.GRU outputs, h_n . 파라미터 3배, 순서 r·z·g 말로 설명할 때의 한 문장 "바닐라 RNN은 매 시점 기억을 덮어써서 긴 문장의 앞부분을 잊습니다. LSTM은 셀 상태라는 별도 기억 통로를 두고, 삭제·입력·출력 게이트로 무엇을 지우고 넣고 꺼낼지 조절합니다. 셀 상태는 덧셈으로 갱신되기 때문에 기울기가 멀리까지 전달될 수 있습니다. GRU는 같은 아이디어를 게이트 두 개로 줄인 가벼운 버전입니다." 다음 편부터는 모델이 아니라 입력 쪽이다. 지금까지는 torch.randn 으로 만든 가짜 단어 벡터를 넣었다. 4.3 토큰화와 4.4 임베딩에서 진짜 문장을 이 (배치, 시점, 차원) 텐서로 바꾸는 법 을 본다.
velog
A high-drive adolescent shepherd bouncing off the walls at Hafer Park needs a radically different approach than a rescue pup who pancakes on the sidewalk whenever a delivery truck rumbles down Broadway. Dogs aren't assembled on a factory line, yet countless owners end up frustrated because they dropped their dog into a generic, one-size-fits-all class that worked against the dog's natural wiring. Finding effective dog training comes down to reading the individual dog in front of you. Once you understand your pup's temperament, you can cut through the marketing noise and choose a program that actually sticks. Read the Dog: Matching Temperament to the Format Before you compare pricing or sign up for a package, evaluate how your dog processes stress, arousal, and new environments. The Timid or Fearful Dog If your dog startles at sudden noises, shrinks behind your legs when greeting strangers, or shuts down in busy environments, skip group classes for now. Dropping an anxious dog into a room with six barking dogs is called "flooding"—it overwhelms their nervous system and often cements reactive habits. These dogs need private, in-home training or quiet one-on-one sessions where they can build confidence through small, predictable wins before facing public distractions. The Hyper-Social Frustrated Greeter This is the dog that screams, pulls, and thrashes on leash—not out of aggression, but because they desperately want to play with every dog they see along the Spring Creek Trail. While they do eventually need proofing around distractions, throwing them straight into a chaotic group class often turns into a 60-minute wrestling match. Start with private lessons to establish solid engagement and handler focus, then graduate to controlled group settings where they learn that other dogs are background noise, not playmates. The Working Breed or High-Drive Pup Malinois, Aussies, German Shepherds, and field-line retrievers don't just want training; they need a job. If their energy isn't channeled into structured obedience, scent work, or impulse-control games, they invent their own hobbies—usually counter-surfing, fence-fighting, or redesigning your drywall. High-drive dogs thrive in intensive programs, structured day-training, or comprehensive board-and-train setups that emphasize clarity, clear drive fulfillment, and firm boundaries. Training Philosophy: Look for Clarity Over Catchphrases The dog training industry is largely unregulated, which means anyone with a leash and an Instagram page can call themselves a behavior specialist. Don't get caught up in flashy jargon. Instead, look for trainers who prioritize clear communication and fair expectations. A good trainer spends as much time teaching you how to handle the leash, time your rewards, and read subtle body language as they do working with the dog. They teach the dog what to do rather than merely correcting what not to do. If you are looking for balanced, real-world results that account for your dog's distinct drives, reputable local options for dog training in Edmond , such as Synergy K9 LLC, build customized programs around the dog's baseline temperament rather than forcing every animal into the exact same rigid box. A solid program adapts its pacing whether a dog is naturally soft and sensitive or stubborn and pushy. Red Flags to Watch Out For As you vet local providers, trust your gut if something feels off during the consultation. Lifetime Guarantees: Dogs are sentient animals with independent brains, fluctuating hormones, and changing environments. No ethical trainer guarantees 100% obedience forever, because long-term success depends heavily on handler consistency at home. Secrecy Around Methods: A professional should happily walk you through the equipment they use, why they use it, and how they phase out training aids. If a facility refuses to let you tour where board-and-train dogs sleep, or won't explain how they address unwanted behaviors, walk away. Ignoring the Human Half of the Leash: If a trainer claims they will "fix" your dog and hand them back like a reprogrammed computer without teaching you the mechanics, the behavior will unravel within two weeks of returning home. Questions to Ask Before You Book Before handing over a deposit for dog training in Edmond, pick up the phone and ask three practical questions: "How do you modify your plan if my dog shuts down or becomes overwhelmed?" You want to hear that they step back, lower the criteria, and help the dog reset rather than applying more pressure. "Where does real-world proofing happen?" Basic obedience in a sterile room is easy; holding a stay while kids ride scooters through Mitch Park is hard. Ask how they transition skills to the real world. "What does your post-program support look like?" Good trainers offer follow-up lessons, text support, or refresher sessions to ensure the habits hold up long after the program ends. The right program won't try to change who your dog is at their core. It simply gives you both the shared language needed to navigate life together safely and without the stress.
velog
📘 혼자 공부하는 네트워크 — 복습 DAY 2 학습 범위: 네트워크 DAY 1 ~ DAY 11 복습 방식: 20문제 풀이 및 해설 학습 내용: HTTP, TCP/UDP, DNS, ARP, 서브넷, Wireshark, 이중화, 로드 밸런싱, 프록시, TLS, BGP Q1. HTTP의 Stateless와 로그인 상태 유지 문제: HTTP는 Stateless 프로토콜인데, 웹사이트에서 로그인 상태를 계속 유지할 수 있는 이유는 무엇일까? 정답: 쿠키와 세션 ID를 이용하기 때문이다. 해설 HTTP는 기본적으로 각 요청을 독립적으로 처리하며 이전 요청의 상태를 기억하지 않는다. 하지만 서버에 로그인 세션을 생성하고, 브라우저에 세션 ID를 전달하면 로그인 상태를 유지할 수 있다. 동작 과정 사용자가 아이디와 비밀번호로 로그인한다. 서버가 인증 정보를 확인하고 세션을 생성한다. 서버가 세션 ID를 브라우저에 전달한다. 브라우저가 세션 ID를 보통 쿠키에 저장한다. 이후 요청에서 세션 ID를 서버에 전달한다. 서버는 세션 ID를 이용해 저장된 세션 정보를 조회한다. 핵심: HTTP는 Stateless지만, 쿠키와 세션을 활용하면 로그인 상태를 유지할 수 있다. Q2. TCP 3-Way Handshake 문제: TCP 연결을 설정할 때 메시지를 주고받는 순서는? 정답 클라이언트 서버 | | | ---------- SYN ------------> | | | | <------ SYN + ACK ----------- | | | | ---------- ACK ------------> | | | TCP 연결 수립 완료 해설 SYN: 클라이언트가 서버에 연결을 요청한다. SYN + ACK: 서버가 요청을 확인하고 자신도 연결을 요청한다. ACK: 클라이언트가 서버의 응답을 확인한다. 3-Way Handshake를 통해 양쪽은 통신 준비 상태를 확인하고 초기 순서 번호를 교환한다. 참고로 TCP 연결을 정상적으로 종료할 때는 일반적으로 4-Way Handshake를 수행한다. Q3. Active-Active와 Active-Standby 문제: 주 서버가 서비스를 제공하고 대기 서버가 장애에 대비하는 이중화 방식은? 정답: Active-Standby 구분 Active-Active Active-Standby 평상시 두 서버 모두 서비스 제공 주 서버가 서비스 제공 장애 발생 시 정상 서버가 서비스 처리 대기 서버가 서비스 인계 특징 서버 자원을 함께 활용 장애에 대비한 대기 서버 운영 Failover(페일오버) 는 주 서버에 장애가 발생했을 때 대기 서버가 서비스를 이어받는 과정을 의미한다. 핵심: 이중화가 구성되어 있어도 자동 장애 감지 및 전환 기능이 없다면 서비스 중단이 발생할 수 있다. Q4. Wireshark 디스플레이 필터 문제: 출발지 IP가 192.168.10.100 이고 TCP 목적지 포트가 443 인 패킷만 표시하는 필터는? 정답 ip.src == 192.168.10.100 && tcp.dstport == 443 필터 의미 ip.src 출발지 IP ip.dst 목적지 IP tcp.srcport TCP 출발지 포트 tcp.dstport TCP 목적지 포트 == 값이 같음 && AND 조건 ` tcp.dstport 조건은 TCP 프로토콜과 목적지 포트를 함께 지정한다. 핵심: Wireshark의 디스플레이 필터는 src_ip 가 아니라 ip.src 와 같은 문법을 사용한다. Q5. HTTP PUT과 PATCH 문제: 기존 프로필에서 나이만 변경하려고 할 때 적합한 HTTP 메서드는? 정답: PATCH 구분 PUT PATCH 주요 용도 리소스 전체 대체 리소스의 일부 수정 요청 데이터 일반적으로 전체 리소스 변경할 항목만 멱등성 보장 반드시 보장하지는 않음 PATCH 요청 예시 PATCH /users/1 HTTP/1.1 Content-Type: application/json { "age": 26 } 핵심: PUT은 전체 대체, PATCH는 부분 수정이다. Q6. TLS와 대칭 키 암호화 문제: TLS에서 실제 애플리케이션 데이터를 주고받을 때 대칭 키 암호화 방식을 사용하는 이유는? 정답: 공개 키 암호화보다 일반적으로 처리 속도가 빠르기 때문이다. 구분 대칭 키 암호화 공개 키 암호화 사용하는 키 같은 키 공개 키와 개인 키 처리 속도 일반적으로 빠름 상대적으로 느림 TLS에서의 역할 실제 데이터 암호화 인증 및 키 교환 과정 등에 활용 TLS는 핸드셰이크 과정에서 세션 키를 안전하게 마련하고, 실제 애플리케이션 데이터는 대칭 키 방식으로 암호화한다. TLS 1.3에서는 일반적으로 (EC)DHE 키 교환으로 공유 비밀을 만들고 인증서와 전자 서명 등을 통해 서버를 인증한다. 핵심: 공개 키 기술은 인증과 안전한 키 교환을 지원하고, 대칭 키는 효율적인 데이터 암호화에 사용된다. Q7. ARP와 기본 게이트웨이 문제: 서로 다른 네트워크에 있는 PC B로 패킷을 보내려면 PC A는 누구의 MAC 주소를 알아내야 할까? 정답: 기본 게이트웨이의 MAC 주소 네트워크 구성 PC A IP: 192.168.1.10 | | ARP를 통해 게이트웨이 MAC 확인 v 라우터 IP: 192.168.1.1 | | 라우팅 후 다음 구간으로 전달 v PC B IP: 192.168.2.10 동작 과정 PC A는 목적지 IP가 다른 네트워크에 있다는 것을 확인한다. ARP를 이용해 기본 게이트웨이의 MAC 주소를 알아낸다. 목적지 IP는 PC B의 IP로 유지하고, 목적지 MAC 주소는 기본 게이트웨이의 MAC 주소로 지정한다. 라우터는 라우팅 테이블을 확인한 후 패킷을 다음 구간으로 전달한다. PC B가 직접 연결된 네트워크에 있다면 라우터는 필요할 때 ARP로 PC B의 MAC 주소를 확인한다. 핵심: IP 주소는 최종 목적지를 나타내고, MAC 주소는 현재 구간에서 프레임을 전달할 대상을 나타낸다. Q8. L4와 L7 로드 밸런서 문제: /images 요청은 이미지 서버로, /api 요청은 API 서버로 전달하려면 어떤 로드 밸런서를 사용해야 할까? 정답: L7 로드 밸런서 계층 주요 정보 L2 MAC 주소 L3 IP 주소 L4 IP 주소, TCP/UDP 포트 L7 HTTP URL, 헤더, 쿠키 등 L7 로드 밸런서 구성 예시 클라이언트 | v L7 로드 밸런서 | +---------+---------+ | | v v /images /api | | v v 이미지 서버 API 서버 L4는 주로 IP 주소와 TCP/UDP 포트 등 전송 계층의 정보를 이용해 트래픽을 분산한다. L7은 HTTP 요청의 URL 경로나 헤더 등 애플리케이션 계층의 정보를 분석해 트래픽을 분산할 수 있다. 핵심: HTTP 요청의 내용에 따라 서버를 선택해야 한다면 L7 로드 밸런서를 활용할 수 있다. Q9. DNS 조회 과정 문제: DNS 재귀 리졸버가 도메인의 IP 주소를 찾기 위해 조회하는 서버의 순서는? 정답: 루트 네임 서버 → TLD 네임 서버 → 권한 있는 네임 서버 DNS 재귀 리졸버 | v 루트 네임 서버 | v TLD 네임 서버 (.com) | v 권한 있는 네임 서버 (example.com) | v DNS 레코드 | v IP 주소 확인 각 서버의 역할 루트 네임 서버: 해당 TLD 네임 서버의 위치를 안내한다. TLD 네임 서버: 해당 도메인을 담당하는 권한 있는 네임 서버의 위치를 안내한다. 권한 있는 네임 서버: 해당 도메인의 DNS 레코드를 제공한다. 실제 조회에서는 DNS 캐시가 존재하면 일부 단계를 생략할 수 있다. 핵심: 루트 → TLD → 권한 있는 네임 서버 순서로 기억한다. Q10. TCP와 UDP 문제: 실시간 음성 통화에서 일반적으로 UDP가 활용되는 이유는? 정답: UDP는 별도의 연결 설정 과정이 없고 TCP처럼 기본적으로 재전송이나 순서 보장을 수행하지 않기 때문이다. 구분 TCP UDP 연결 방식 연결 지향형 비연결형 연결 설정 3-Way Handshake 별도의 연결 설정 없음 전달 보장 제공 기본적으로 제공하지 않음 순서 보장 제공 제공하지 않음 활용 웹 통신, 파일 전송 등 실시간 음성·영상, DNS 등 UDP는 TCP보다 오버헤드가 작고 지연을 줄이는 데 유리하지만 반드시 전송 속도가 더 빠른 것은 아니다. 실제 성능은 네트워크 상태와 애플리케이션 구현에 따라 달라진다. 핵심: TCP는 신뢰성 있는 전송을 제공하고, UDP는 단순한 전송 방식으로 실시간 통신에 유리할 수 있다. Q11. HTTP 502 Bad Gateway 문제: HTTP 502 Bad Gateway는 어떤 상황에서 발생할까? 정답: 게이트웨이나 프록시 서버가 상위 서버로부터 유효하지 않은 응답을 받았을 때 발생한다. 클라이언트 | v 리버스 프록시 | | 상위 서버 응답 문제 v WAS => 클라이언트에 502 응답 실무 점검 항목 WAS 프로세스가 정상적으로 실행 중인지 확인 프록시에서 WAS의 IP와 포트로 접속할 수 있는지 확인 프록시의 상위 서버 설정 확인 프록시 및 WAS 오류 로그 확인 관련 상태 코드 상태 코드 의미 200 OK 401 Unauthorized 404 Not Found 502 Bad Gateway 504 Gateway Timeout 502는 유효하지 않은 응답을 받았을 때 발생하며, 504는 제한 시간 내에 상위 서버의 응답을 받지 못했을 때 발생한다. Q12. HTTP 캐시와 304 Not Modified 문제: 브라우저가 304 Not Modified 응답을 받으면 어떻게 동작할까? 정답: 기존에 저장된 캐시 데이터를 재사용한다. 동작 과정 브라우저가 이전에 다운로드한 리소스를 캐시에 저장한다. 캐시가 만료되면 서버에 리소스의 변경 여부를 확인한다. 변경되지 않았다면 서버가 304 Not Modified 를 응답한다. 브라우저가 기존 캐시 데이터를 재사용한다. 캐시의 장점 불필요한 네트워크 트래픽 감소 리소스 응답 속도 향상 서버의 데이터 전송 부담 감소 캐시가 아직 유효하다면 서버에 재검증 요청을 보내지 않고 바로 사용할 수도 있다. 핵심: 304는 리소스가 변경되지 않았다는 의미이며, 캐시를 재사용할 수 있다. Q13. 단일 장애점(SPoF) 문제: WEB 서버 두 대를 이중화했지만 로드 밸런서는 한 대만 운영하는 경우, 로드 밸런서에 장애가 발생하면 어떻게 될까? 정답: 서버 두 대가 모두 정상이더라도 클라이언트가 서비스에 접근하지 못할 수 있다. 이처럼 한 구성 요소의 장애가 전체 서비스에 영향을 줄 수 있는 지점을 단일 장애점(SPoF, Single Point of Failure) 이라고 한다. 클라이언트 | v 로드 밸런서 (장애 발생) X | +-------+-------+ | | v v WEB 서버 A WEB 서버 B 정상 정상 서버는 정상이지만 요청이 전달되지 않음 대응 방안 로드 밸런서도 이중화하고 장애 감지 및 자동 전환 기능을 구성할 수 있다. 핵심: 일부 장비를 이중화했다고 해서 전체 시스템의 단일 장애점이 사라지는 것은 아니다. Q14. Forward Proxy와 Reverse Proxy 문제: 회사 직원의 인터넷 요청을 대신 외부 서버에 전달하고 접속 기록 및 접근을 관리하는 프록시는? 정답: Forward Proxy 1 Forward Proxy 클라이언트를 대신해 외부 서버에 요청을 전달한다. 클라이언트 | v Forward Proxy | v 외부 웹 서버 주요 활용 사례는 인터넷 접근 제어, 접속 기록 관리, 캐싱 등이다. 2 Reverse Proxy 외부에서 들어온 요청을 받아 내부 서버에 전달한다. 외부 클라이언트 | v Reverse Proxy | +---+---+ | | v v 서버 A 서버 B 주요 활용 사례는 내부 서버 보호, 로드 밸런싱, 캐싱 등이다. 핵심 Forward Proxy: 클라이언트 측에서 클라이언트를 대신한다. Reverse Proxy: 서버 측에서 서버를 대신한다. Q15. CIDR과 서브넷 계산 문제: 192.168.10.130/26 의 네트워크 주소, 브로드캐스트 주소, 사용 가능한 호스트 범위는? 정답 항목 값 IP 주소 192.168.10.130/26 서브넷 마스크 255.255.255.192 네트워크 주소 192.168.10.128 브로드캐스트 주소 192.168.10.191 호스트 범위 192.168.10.129 ~ 192.168.10.190 사용 가능한 호스트 수 62개 계산 과정 IPv4는 총 32비트이고, /26 은 네트워크 비트가 26비트라는 의미다. 호스트 비트 = 32 - 26 = 6비트 전체 IP 주소 수 = 2^6 = 64개 사용 가능한 호스트 수 = 64 - 2 = 62개 서브넷 구간 192.168.10.0 ~ 192.168.10.63 192.168.10.64 ~ 192.168.10.127 192.168.10.128 ~ 192.168.10.191 ← 해당 구간 192.168.10.192 ~ 192.168.10.255 일반적인 IPv4 서브넷에서는 네트워크 주소와 브로드캐스트 주소를 제외하고 호스트에 IP를 할당한다. Q16. TCP 흐름 제어와 혼잡 제어 문제: 수신자의 버퍼를 보호하는 제어와 네트워크의 혼잡을 방지하는 제어는 각각 무엇일까? 정답: 흐름 제어와 혼잡 제어 구분 흐름 제어 혼잡 제어 영어 Flow Control Congestion Control 목적 수신자의 처리 능력 초과 방지 네트워크 혼잡 방지 고려 대상 수신자의 버퍼 네트워크의 혼잡 상태 주요 메커니즘 수신 윈도우(rwnd) 혼잡 윈도우(cwnd) 1 흐름 제어 송신자가 데이터를 너무 빠르게 보내면 수신자의 버퍼가 가득 찰 수 있다. 수신자가 처리할 수 있는 양을 고려해 송신량을 조절하는 것이 흐름 제어다. 2 혼잡 제어 네트워크에 패킷이 지나치게 많이 몰리면 지연과 패킷 손실이 발생할 수 있다. 네트워크의 혼잡 징후를 고려해 송신량을 조절하는 것이 혼잡 제어다. 핵심 흐름 제어: 수신자가 감당할 수 있는가? 혼잡 제어: 네트워크가 감당할 수 있는가? Q17. TCP 빠른 재전송 문제: 동일한 ACK 번호를 반복해서 받은 송신자가 재전송 타이머가 만료되기 전에 손실된 것으로 추정하는 세그먼트를 다시 보내는 기법은? 정답: 빠른 재전송(Fast Retransmit) 동작 예시 송신자 수신자 | | | -------- 데이터 1 ---------> | | -------- 데이터 2 ---------> | | -------- 데이터 3 --- X | 손실 | -------- 데이터 4 ---------> | | -------- 데이터 5 ---------> | | | | <------ 중복 ACK ----------- | | <------ 중복 ACK ----------- | | <------ 중복 ACK ----------- | | | | ---- 데이터 3 재전송 ------> | TCP는 일반적으로 동일한 ACK 번호를 3번 중복해서 받으면 손실 가능성을 판단해 빠른 재전송을 수행한다. 다만 패킷의 도착 순서가 바뀌었을 때도 중복 ACK가 발생할 수 있다. 구분 빠른 재전송 슬로 스타트 영어 Fast Retransmit Slow Start 목적 손실된 데이터 재전송 혼잡 윈도우 증가 관련 기능 손실 복구 혼잡 제어 핵심: 빠른 재전송은 손실 복구, 슬로 스타트는 혼잡 제어와 관련된 기능이다. Q18. 디지털 인증서와 CA 문제: CA(Certificate Authority)의 주요 역할은? 정답: 디지털 인증서를 발급하고 전자 서명해 공개 키와 인증서에 기재된 신원 정보를 연결한다. HTTPS 인증서 검증 과정 웹 서버 | | 디지털 인증서 전달 v 클라이언트 | | 유효기간 및 도메인 확인 v 인증서 체인 검증 | | 신뢰할 수 있는 CA 확인 v 전자 서명 검증 | v 서버 인증 확인 CA는 서버의 신원을 검증할 수 있도록 신뢰 체계를 제공한다. 클라이언트는 인증서의 유효기간과 도메인 일치 여부, 인증서 체인, 전자 서명 등을 확인한다. CA가 클라이언트와 서버 사이의 모든 HTTPS 데이터를 직접 암호화하는 것은 아니다. 핵심: CA는 디지털 인증서의 신뢰성을 검증할 수 있도록 지원하는 인증 기관이다. Q19. MTU와 IPv4 단편화 문제: 크기가 2,000바이트인 IPv4 패킷이 MTU 1,500바이트인 구간을 통과해야 할 때, DF 비트가 0이면 어떻게 처리할까? 정답: MTU에 맞게 패킷을 단편화할 수 있다. MTU(Maximum Transmission Unit) 는 네트워크 구간에서 한 번에 전송할 수 있는 패킷의 최대 크기를 의미한다. 단편화 개념도 원본 IPv4 패킷 2,000바이트 | v MTU 1,500바이트 | v 단편화 | +-----+-----+ | | v v 단편 1 단편 2 MTU 이하 MTU 이하 단편화된 각 패킷에는 별도의 IPv4 헤더가 붙으며, 최종 목적지에서 재조립한다. DF(Don't Fragment) 비트 값 의미 DF = 0 단편화 허용 DF = 1 단편화 금지 DF가 1인 패킷이 MTU보다 크면 라우터는 해당 패킷을 단편화하지 못하므로 폐기하고 일반적으로 ICMP Fragmentation Needed 메시지를 보낸다. DF 비트는 경로 MTU 탐색(Path MTU Discovery)에도 활용된다. 핵심: DF는 Don't Fragment, 즉 단편화하지 말라는 의미다. Q20. BGP와 AS 문제: AS 65001과 AS 65002처럼 서로 다른 AS 사이에서 라우팅 정보를 교환할 때 사용하는 BGP는? 정답: eBGP(External BGP) 구분 iBGP eBGP 정식 명칭 Internal BGP External BGP 통신 대상 같은 AS의 BGP 라우터 서로 다른 AS의 BGP 라우터 예시 AS 65001 ↔ AS 65001 AS 65001 ↔ AS 65002 AS(Autonomous System) 는 공통된 라우팅 정책에 따라 관리되는 네트워크의 집합이다. BGP는 AS 사이에서 라우팅 정보를 교환하는 데 사용하는 프로토콜이며, iBGP와 eBGP라는 동작 방식이 있다. 핵심 iBGP: 같은 AS 내부 eBGP: 서로 다른 AS 사이 📌 DAY 2 — 오답 및 헷갈렸던 개념 문제 개념 핵심 복습 Q4 Wireshark ip.src , tcp.dstport Q5 HTTP 메서드 PUT은 전체 대체, PATCH는 부분 수정 Q9 DNS 루트 → TLD → 권한 있는 네임 서버 Q10 TCP/UDP UDP가 반드시 더 빠른 것은 아님 Q13 SPoF 장비 하나의 장애가 전체 서비스에 영향을 줄 수 있음 Q14 프록시 Forward는 클라이언트 측, Reverse는 서버 측 Q16 TCP 제어 흐름 제어는 수신자, 혼잡 제어는 네트워크 Q17 TCP 재전송 중복 ACK와 빠른 재전송 🎯 다음 복습 목표 — DAY 3 Wireshark 디스플레이 필터 직접 작성하기 PUT과 PATCH의 차이 복습하기 TCP 흐름 제어와 혼잡 제어 구분하기 중복 ACK와 빠른 재전송 이해하기 Forward Proxy와 Reverse Proxy 구분하기 앞서 학습한 내용과 새로운 범위를 섞어 총 20문제 풀이하기 DAY 2 복습 완료! ✅ #네트워크 #혼자공부하는네트워크 #네트워크공부 #TCP #UDP #HTTP #Wireshark #DNS #정보보안 #복습
velog
2026년 목표 클라우드 환경 운영 경험(상세 내용은 추후 작성) 보안관제 자동화 경험 블로그 꾸준히 작성 자격증 : 정보처리기사(9월 시작), 정보보안기사, AWS-SAA,/// CISA 및 CISSP(정보 보안 관련 경력 5년 이상 필요 (4년 경력+보안 관련 학위 가능)) 개발 공부 영어 공부 운동 리팩토링 과정 복습 및 벨로그에 새롭게 작성 클라우드 보안 복습 및 벨로그에 작성 <내년 예정 - 석사 과정> 📅 공부 순서 - (Version 10월) 파이썬(점프 투 파이썬) 완강했음 - 지속적인 복습 정보처리기사 실기 - 10월 25일에 시험있음 합격 목표 모의해킹(노말틱 강의) - 10월 말까지 완료 목표 영어 - 11월부터 시작! 혼자공부하는 네트워크(인프런) 완강했음 - 지속적인 복습 리펙토링 과정 복습 시작(실습 및 블로그 재작성) Docker(인프런_devsecops) 강의(모의해킹 끝나고 시작) AWS 보안 가이드(인프런 강의) - (Docker 인프런 끝나고 시작) JAVA - (파이썬 어느 정도 할 줄 알때 시작) → 1 + 2 + 3 + 5 → 1 + 4 + 6 + 7 📅 금주 목표 - (09/28(월)~10/04(일)) 파이썬(점프 투 파이썬) Youtube 강의 + Ebook 참고 목표 : 점프 투 파이썬 학습 계속 진행 및 진도율 향상 정보처리기사 실기 목표 : 2020년도 기출문제 2회차 풀이 범위 : 1회차 ~ 4회차 목표 : 2021년도 기출문제 1회차 풀이 범위 : 1회차 ~ 3회차 목표 : 2022년도 기출문제 1회차 풀이 범위 : 1회차 ~ 3회차 모의해킹 목표 : Day 1 ~ Day 2 완료 범위 : 1주차 ~ 2주차 📅 오늘의 목표 : 완료 OR 미완료 OR 진행중 모의해킹(노말틱 강의) 1주차 ~ 하는데 까지 + 블로그 정리 파이썬(nmap 기능 구현해보기)DAY-3 + 블로그 정리 household account 작성(23:50분에 작성) 정보처리기사 DAY3(2020년도 2회차 문제풀이 및 복습) + 2022년도 1회차 문제풀이 방청소 분리수거 혼자공부하는 네트워크 복습 DAY3 파이썬 복습 DAY1 빨래(Laundry) 개기 💻 오늘(완료) 한 일 분리수거
Score: 54.34Confidence: 49%
View offervelog
본편에서는 AI 응답자가 300문항 평균 12.4%p 틀렸다는 이야기를 했습니다. → 본편 읽기 여기서는 본편에 안 넣은 네 가지를 봅니다. 모델을 바꾸면 결론이 어떻게 뒤집히는지. 다양성이 사라지는 게 숫자로 어떻게 보이는지. 왜 보정을 걸 수 없는지. 그리고 이 연구를 어디까지 믿어도 되는지. 1. 모델을 바꾸면 미국인이 달라진다 Pew는 Claude Opus 4.6과 GPT-5.1 두 모델로 같은 설문을 돌렸습니다. 평균 오차는 Opus 11.4%p, GPT-5.1 13.3%p였습니다. 여기까지만 보면 "둘 다 비슷하게 못한다"로 읽힙니다. 그런데 문항을 하나씩 뜯어보면 둘은 반대 방향으로 틀렸습니다. 질문 사람 Opus GPT 나라가 가는 방향에 불만 69% 70% 100% 낙태가 합법이어야 한다 60% 62% 48% 트럼프 지지자 중 "매우 강하게 지지" 65% 46% 88% GPT 세계의 미국인은 100%가 나라에 불만입니다. Opus 세계의 미국인은 트럼프를 지지하긴 하는데 그렇게 열렬하지는 않습니다. Pew가 쓴 표현을 빌리면 이렇습니다. GPT는 미국인을 실제보다 극단적으로 그렸고, Opus는 실제보다 중도적으로 그렸습니다. 둘 다 사람이 아닙니다. 이게 왜 치명적인지는 이렇게 생각해 보면 됩니다. AI로 여론조사를 돌리는 사람은 모델을 하나 고릅니다. 그 선택이 결론의 방향을 정합니다. 그런데 모델을 고를 때 참고할 정답지가 없어요. 정답지가 있으면 애초에 AI를 안 썼겠죠. 2. 다양성이 사라지는 걸 숫자로 보기 본편에서 "질문의 47%에 아무도 안 고른 보기가 있었다"를 봤습니다. 기준을 조금 느슨하게 잡아도 비슷합니다. 응답률이 1%도 안 되는 보기가 있는 질문은 AI 설문에서 66%였습니다. 실제 설문에서는 1%였습니다. 정치 얘기가 아닌 질문에서 더 선명하게 보입니다. 잠을 몇 시간 자느냐는 질문이 그렇습니다. 하루 수면 시간 사람 AI 5~6시간 39% 69% 7~9시간 54% 31% 4시간 이하 또는 10시간 이상 9% 0% 사람 100명 중 9명은 4시간 이하로 자거나 10시간 이상 잡니다. AI 응답자 중에는 그런 사람이 한 명도 없었습니다. 방문한 나라 수를 물었을 때도 같았습니다. 10개국 이상 가봤다는 사람이 실제로는 13%인데, AI 응답자는 1%였습니다. 여기서 중요한 건 이게 버그가 아니라는 점입니다. 언어 모델은 다음에 올 가능성이 가장 높은 말을 고르는 장치입니다. "40대 중산층 남성이라면 몇 시간 자겠는가"에 가장 그럴 법한 답은 6시간입니다. 4시간은 그럴 법하지 않습니다. 그런데 실제 세상에는 4시간 자는 사람이 있습니다. 여론은 대체로 "그럴 법하지 않은 답을 고른 소수"로 채워져 있습니다. AI는 바로 그 부분을 꾸준히 지웁니다. 3. 고정관념은 이렇게 증폭된다 본편의 월드컵 예시 말고도 쌍이 더 있습니다. 집단과 질문 실제 AI 히스패닉 — 스페인어 수업이 매우 중요하다 32% 72% 민주당 성향 — 억만장자의 재산이 나라에 해롭다 45% 86% 공화당 성향 — 이스라엘에 호감이 있다 58% 90% 이상 중국의 국제적 영향력이 강해졌다 62% 100% 패턴이 보입니다. AI는 집단 이름을 받으면 그 집단의 교과서적 입장을 거의 만장일치로 답합니다. 실제 구성원들은 그 입장에 절반 조금 넘게만 동의합니다. 본편에서 봤듯이 AI는 히스패닉이 아닌 사람들의 월드컵 관심도는 거의 맞혔습니다. 꼬리표가 안 붙은 집단은 잘 맞히고, 꼬리표가 붙은 집단은 크게 틀립니다. 4. 틀리는 방향이 일정하지도 않다 "AI가 늘 과장한다"고 정리하면 편한데, 그것도 아닙니다. 최근 사건을 묻는 문항들을 보면 부호가 섞여 있습니다. 질문 사람 AI 방향 데이터센터가 환경에 나쁘다 53% 98% 과장 전기요금이 매우 걱정된다 52% 23% 축소 단속 요원이 얼굴을 가려도 된다 38% 17% 축소 이란 공습에 찬성한다 36% 48% 과장 보정을 걸 수 없다는 뜻입니다. "AI 결과에서 20%p 빼면 된다" 같은 교정 규칙을 만들 수가 없어요. 문항마다 부호가 바뀝니다. 5. 이 연구의 한계 셋 호의적으로 읽으면 반론도 가능합니다. 하나, prompt가 전부일 수 있습니다. Pew는 인구통계와 2025년 정치 성향 응답을 줬습니다. 과거 설문 응답을 더 주거나, 답하기 전에 길게 생각하게 했다면 달랐을 수 있습니다. 다만 Pew는 여러 모델을 시험하고 그중 가장 잘한 걸 골랐습니다. 대충 한 비교는 아닙니다. 둘, 정답지도 흔들립니다. 비교 기준은 같은 사람들의 실제 응답입니다. 그런데 사람도 설문에서 적당히 답하고, 질문을 잘못 읽고, 기분에 따라 다르게 답합니다. 그 흔들림까지 전부 AI 오차로 계산됐습니다. 셋, 잰 건 한 가지 쓰임새입니다. 이 실험이 안 된다고 말한 건 "전국 여론의 비율을 AI로 추정하기"입니다. 설문 문항의 표현이 헷갈리는지 미리 보기. 응답 비율 말고 응답 이유를 탐색하기. 이런 용도까지 같이 틀렸다고 말하기엔 근거가 부족합니다. 6. 정리 결과를 한 줄로 줄이면 이렇습니다. AI는 평균을 잘 맞히고 분포를 못 맞힙니다. 그리고 여론조사가 알고 싶은 건 대개 분포입니다. 지식 문제 정답률이 사람 50%, AI 80%였다는 숫자가 이걸 압축해서 담고 있습니다. AI 응답자는 모범적인 시민이었습니다. 문제는 모범적인 시민이 미국 인구의 대표가 아니라는 것이었습니다. 출처 Pew Research Center, "Silicon Samples and Synthetic Surveys: Can AI Stand In for Human Respondents?", 2026년 9월 30일 https://pewresearch.org/data-labs/2026/09/30/can-ai-stand-in-for-human-survey-takers-not-really
velog
히스패닉 미국인이 월드컵을 얼마나 챙겨 볼 것 같냐고 AI에게 물었습니다. AI는 97%라고 답했습니다. 같은 질문에 실제 히스패닉 응답자들이 답한 건 42%였습니다. 그런데 히스패닉이 아닌 사람들한테는 같은 질문에 AI가 22%라고 했습니다. 실제는 25%였습니다. 3%p 차이. 거의 맞혔습니다. 한쪽은 맞히고 한쪽은 두 배 넘게 틀렸다는 게 이 이야기의 전부입니다. AI가 못해서 틀린 게 아니었어요. "히스패닉이면 축구를 좋아하겠지"를 너무 잘해서 틀렸습니다. 같은 질문인데 한쪽만 틀렸습니다. 굵은 선이 AI 응답입니다. 뭘 한 실험인가 미국의 여론조사 기관 Pew Research Center가 9월 30일에 이 결과를 냈습니다. Pew는 American Trends Panel이라는 걸 운영합니다. 미국 성인 전체에서 무작위로 뽑은 사람들을 패널로 모셔 둡니다. 그리고 같은 사람들에게 주기적으로 같은 설문을 돌립니다. 누가 답했는지를 Pew는 이미 알고 있다는 뜻이에요. 이번에 한 일은 이렇습니다. 그 패널에 실제로 있는 사람 한 명 한 명의 정보를 AI에게 줬습니다. 나이, 성별, 인종, 학력 같은 인구통계. 그리고 2025년에 미리 받아둔 정치 성향 설문 응답. 그러고 "당신이 이 사람입니다"라고 시킨 다음, 똑같은 설문을 풀게 했습니다. 이렇게 만든 가짜 응답자를 digital twin(디지털 쌍둥이)이라고 부릅니다. 이 방식이 요즘 조용히 퍼지고 있어요. 설문은 돈과 시간이 많이 드니까, AI로 대신 돌려서 싸고 빠르게 여론을 보자는 겁니다. 이 실험이 좋은 건 채점이 된다는 겁니다. 같은 사람이 실제로 답한 결과가 이미 손에 있으니까요. 2026년에 돌린 설문 세 개, 300문항 가까이를 그렇게 맞춰봤습니다. 주로 쓴 모델은 Claude Opus 4.6입니다. 여러 모델을 돌려보고 성적이 가장 좋았던 걸 골랐습니다. 같은 사람에게 두 번 답을 받았기 때문에 채점이 됩니다. 좋은 소식: 큰 그림은 꽤 맞는다 미국인 전체를 한 덩어리로 보고 묻는 질문에서는 성적이 나쁘지 않았습니다. "나라가 가는 방향에 불만인가" — 실제 69%, AI 70%. "낙태가 합법이어야 하나" — 실제 60%, AI 62%. 여론조사에서 2%p 차이는 보통 오차 범위 안입니다. 사람 1,000명한테 물어도 뽑기 운에 따라 그 정도는 흔들린다는 뜻이에요. 이 정도만 보면 쓸 만해 보입니다. 함정 1: 쪼개는 순간 무너진다 300문항 전체의 평균 오차는 12.4%p였습니다. 질문 네 개 중 하나 넘게(28%) 오차가 15%p를 넘었습니다. 12.4%p가 어느 정도인지 감이 안 올 수 있는데, 지지율 42%와 55%의 차이입니다. 선거 결과가 뒤집히는 폭이에요. 더 불편한 건 집단별 성적입니다. 오차가 12%p 아래로 내려간 집단이 하나도 없었습니다. 공화당·공화당 성향 응답자에서 16.1%p, 흑인 응답자에서 15.1%p가 가장 컸습니다. 전체 평균이 맞았던 건 반대 방향 오차끼리 서로 지웠기 때문입니다. 큰 숫자 하나만 보면 괜찮아 보이고, 쪼개면 다 틀려 있습니다. 함정 2: AI는 망설이지 않는다 여기가 제일 흥미로운 부분입니다. 사람 응답자는 전체 응답의 16%에서 "모르겠다"를 골랐습니다. AI는 4%였습니다. 사람의 4분의 1입니다. 지식을 묻는 문제 13개에서는 더 벌어집니다. 사람의 평균 정답률은 50% 정도였고, 75%를 넘긴 문제가 하나도 없었습니다. AI는 평균 80%였고, 여섯 문제는 98% 이상을 맞혔습니다. 수정헌법 1조가 언론 자유를 보장하냐는 문제에서 사람은 52%, AI는 98%였습니다. AI는 시민으로서 너무 모범적이었습니다. 여론조사가 알고 싶은 건 "사람들이 정답을 아는가"가 아닙니다. "사람들이 실제로 어떻게 알고 있는가"입니다. 여기서는 잘 맞히는 게 틀린 겁니다. 함정 3: 선택지가 비어버린다 실제 설문에서는 보기가 다섯 개 있으면 다섯 개 모두에 누군가는 표를 던집니다. AI 설문에서는 달랐습니다. 질문의 47%에서, 단 한 명도 고르지 않은 보기가 최소 하나씩 나왔습니다. 실제 설문에서 그런 질문은 0개였습니다. 미중 무역 질문이 좋은 예입니다. AI 응답자 98%가 "중국이 더 이득"을 골랐습니다. 실제 사람들은 42%만 그랬습니다. 나머지는 미국이 이득(10%), 둘 다 비슷(24%), 모르겠다(19%)로 갈라졌습니다. AI는 가장 많은 사람이 고를 법한 답을 아주 잘 찾아냅니다. 그리고 그 주변에 흩어져 있던 사람들을 지워버립니다. AI는 가장 그럴 법한 보기 하나에 몰립니다. 함정 4: 작년 일까지만 안다 이번에 쓴 모델이 학습한 데이터는 2025년 5월까지입니다. 그 뒤에 벌어진 일을 묻는 질문에서 바로 티가 났습니다. "데이터센터에 대해 전혀 들어본 적 없다"에 AI는 3%, 사람은 26%였습니다. AI 세계에서는 모두가 데이터센터를 압니다. "전기요금이 매우 걱정된다"는 AI 23%, 사람 52%였습니다. 2026년 미국에서 전기요금이 피부에 닿는 문제가 됐다는 걸, 모델은 몰랐습니다. 그런데 이 결과를 어디까지 믿어야 할까 반대쪽도 봐야 합니다. 첫째, prompt를 어떻게 쓰느냐에 따라 결과가 바뀝니다. 이 실험은 인구통계와 정치 성향만 줬습니다. 더 많은 정보를 줬다면 성적이 달라졌을 수 있어요. 둘째, 비교 기준인 사람 응답도 완벽하지 않습니다. 사람도 설문에서 적당히 답하고, 질문을 잘못 읽습니다. 그 오차까지 전부 AI 몫으로 계산된 구도예요. 셋째, 쓰임새를 구분해야 합니다. 이 실험이 안 된다고 말한 건 "미국인 몇 %가 X를 지지하나"를 AI로 알아내는 일입니다. 설문 문항이 헷갈리게 쓰였는지 미리 돌려보는 용도까지 싸잡아 틀렸다고 말하긴 어렵습니다. 그래도 Pew의 결론 자체는 분명합니다. 사회적으로 중요한 주제의 여론조사를 AI로 대체할 수는 없다는 쪽입니다. 🔍 더 깊이 본편에 안 넣은 세 가지를 심화편에서 봅니다. 1 모델을 Opus에서 GPT-5.1로 바꾸면 미국인이 달라집니다. "나라가 가는 방향에 불만인가"에 사람은 69%, Opus는 70%, GPT는 100%였습니다. 2 다양성이 사라지는 게 정치 얘기가 아닌 질문에서 더 선명합니다. 하루 4시간 이하로 자거나 10시간 이상 자는 사람이 실제로는 9%인데, AI 응답자 중에는 0명이었습니다. 3 AI가 늘 과장하는 것도 아닙니다. 문항마다 부호가 바뀌어서 보정을 걸 수가 없습니다. → 심화편 읽기 가져갈 것 하나 AI로 사람을 대신 세우는 일은 설문에서만 벌어지지 않습니다. 가상 고객 인터뷰, 페르소나 테스트, 합성 데이터. 다 같은 구조입니다. 이 실험이 알려주는 건 그 결과물이 틀리는 방향입니다. AI는 무작위로 틀리지 않습니다. 가장 전형적인 쪽으로, 가장 확신에 찬 모습으로, 소수 의견을 지우면서 틀립니다. 그리고 그렇게 나온 결과는 그럴듯하게 읽힙니다. 틀린 걸 알아채기 어려운 이유가 거기 있습니다. 출처 Pew Research Center, "Silicon Samples and Synthetic Surveys: Can AI Stand In for Human Respondents?", 2026년 9월 30일 https://pewresearch.org/data-labs/2026/09/30/can-ai-stand-in-for-human-survey-takers-not-really
velog
문제 요약 n x n 시계 격자에서 한 시계를 조작하면 자기 자신과 상하좌우 인접 시계가 시계 방향으로 90도 회전한다. 모든 시곗바늘을 12시 방향인 0 으로 만들기 위한 최소 조작 횟수를 구한다. 시계 방향은 0, 1, 2, 3 으로 표현하며 모든 변화는 mod 4 연산으로 처리할 수 있다. 핵심 관찰 1. 같은 시계는 최대 3번만 조작하면 된다 한 시계를 4번 조작하면 영향을 받는 모든 시계가 한 바퀴 돌아 원래 상태로 돌아온다. 따라서 최적해에서 각 시계의 조작 횟수는 0 , 1 , 2 , 3 번 중 하나만 고려하면 충분하다. 2. 첫 행을 제외한 행의 조작은 강제로 결정된다 r 행의 시계를 조작할 수 있는 시점에는 r - 1 행을 더 이상 바꿀 수 있는 방법이 거의 없다. r - 1 행의 c 열 시계에 영향을 주는 아래 행의 조작은 오직 (r, c) 의 조작뿐이다. 그러므로 (r - 1, c) 를 0 으로 만들기 위해 (r, c) 를 몇 번 조작해야 하는지는 다음처럼 유일하게 결정된다. count = (-board[r - 1][c]) % 4 첫 행의 조작 횟수만 정하면, 둘째 행부터 마지막 행까지의 조작 횟수는 모두 자동으로 정해진다. 풀이 과정 첫 행의 각 칸을 0~3 번 조작하는 모든 경우를 탐색한다. 첫 행 조작을 격자에 적용한다. r = 1 부터 마지막 행까지 순회한다. 바로 위 행의 각 시계를 0으로 만들기 위해 현재 행의 같은 열 시계를 필요한 횟수만큼 조작한다. 마지막 행이 모두 0인 경우, 조작 횟수 최솟값을 갱신한다. 첫 행의 경우의 수는 최대 4^8 = 65,536 개이므로 충분히 탐색할 수 있다. Python 코드 from itertools import product def solution(clockHands): n = len(clockHands) answer = float("inf") dr = [0, -1, 1, 0, 0] dc = [0, 0, 0, -1, 1] def rotate(board, row, col, count): """(row, col)을 count번 조작한 결과를 보드에 반영한다.""" for direction in range(5): nr = row + dr[direction] nc = col + dc[direction] if 0 <= nr < n and 0 <= nc < n: board[nr][nc] = (board[nr][nc] + count) % 4 # 첫 행의 모든 조작 조합을 시도한다. for first_row in product(range(4), repeat=n): board = [row[:] for row in clockHands] operation_count = sum(first_row) # 첫 행 조작을 적용한다. for col, count in enumerate(first_row): if count: rotate(board, 0, col, count) # 현재 행을 조작해 바로 위 행을 0으로 확정한다. for row in range(1, n): for col in range(n): count = (-board[row - 1][col]) % 4 if count: rotate(board, row, col, count) operation_count += count # 마지막 행도 모두 0이면 유효한 해다. if all(clock == 0 for clock in board[-1]): answer = min(answer, operation_count) return answer 정당성 설명 첫 행의 각 칸은 0~3번만 조작하면 되므로, 알고리즘은 가능한 첫 행 조작 조합을 모두 탐색한다. 임의의 첫 행 조작 조합을 고정하자. r - 1 행 c 열에 영향을 주는 아직 선택되지 않은 조작은 (r, c) 뿐이다. 따라서 이 시계를 0 으로 만들려면 (r, c) 를 (-board[r - 1][c]) mod 4 번 조작해야 하며, 다른 횟수로는 r - 1 행을 0으로 확정할 수 없다. 그러므로 고정된 첫 행 조합에 대해 알고리즘이 계산한 이후 행의 조작은 유일하며, 그 조합에서 가능한 해가 존재한다면 반드시 찾아낸다. 모든 첫 행 조합을 탐색하므로 모든 가능한 해를 검토하고, 그중 최소 조작 횟수를 반환한다. 복잡도 분석 첫 행의 조작 조합은 4^n 개다. 각 조합마다 n^2 개의 칸을 처리하고, 한 번의 조작 반영은 최대 5개 칸에만 영향을 준다. 시간 복잡도: O(4^n * n^2) 공간 복잡도: O(n^2) n <= 8 이므로 최대 65,536 개의 첫 행 조합만 확인하면 된다. 주의할 점 조작 횟수는 board[row - 1][col] 이 아니라 그 음수의 mod 4 값이다. 현재 값이 3 이면 한 번 조작해 0 으로 만들어야 한다. 현재 행을 처리할 때는 반드시 바로 위 행 을 0으로 확정해야 한다. 마지막 행은 아래에서 보정할 행이 없으므로, 모든 값이 0인지 직접 검사해야 한다. 보드마다 독립적으로 시뮬레이션해야 하므로, 첫 행 조합을 바꿀 때 원본 배열을 깊은 복사해야 한다. 마무리 행 단위로 보면 첫 행만 선택이고 나머지는 강제 전이라는 구조가 보인다. 첫 행의 작은 경우의 수를 완전탐색하고, 이후 행을 위에서 아래로 확정해 나가면 최소 조작 횟수를 구할 수 있다.
Score: 54.33Confidence: 49%
View offerScore: 54.38Confidence: 49%
Score: 54.35Confidence: 49%
Score: 54.35Confidence: 49%
Score: 54.35Confidence: 49%
Score: 54.34Confidence: 49%
Score: 54.34Confidence: 49%
Score: 54.34Confidence: 49%