[๐Ÿ“œ|DL] CNN์˜ ์กฐ์ƒ, LeNet-5๋Š” ์™œ ์ด์ƒํ• ๊นŒ? (๋ฌธ์ œ์˜ Conv3 ๊ตฌํ˜„)

minseok128ยท2024๋…„ 11์›” 10์ผ
1
post-thumbnail

์ง€๊ธˆ์œผ๋กœ๋ถ€ํ„ฐ ๋ฌด๋ ค 27๋…„ ์ „ ํƒ„์ƒํ•œ ๊ณ ๋Œ€์˜ ์ธ๊ณต์ง€๋Šฅ.
1998๋…„์— ์ œ์‹œ๋œ ํ•ฉ์„ฑ๊ณฑ์‹ ๊ฒฝ๋ง(CNN)์˜ ์กฐ์ƒ LeNet-5๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž
ํŠนํžˆ ๋…ผ๋ฌธ ์† ๋ฌธ์ œ์˜ CONV3 ๋ ˆ์ด์–ด๊นŒ์ง€...!


Hello CNN!

์œ„์˜ ์—ฐํ‘œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, LeNet-5๋Š” ์ธ๊ณต์ง€๋Šฅ๊ณผ CNN์ด๋ผ๋Š” ๊ฐœ๋…์ด ์ฃผ๋ฅ˜๋กœ์„œ ์œ ํ–‰ํ•˜๊ธฐ ์ „์— ์ œ์‹œ๋˜์–ด, ํ˜„๋Œ€ CNN ๋ชจ๋ธ๋“ค์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ฆ์€ ์ดˆ๊ธฐ์˜ ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์ด๋‹ค.
1998๋…„์— Yann LeCun์ด ๊ฐœ๋ฐœํ•œ LeNet-5๋Š” ์ฃผ๋กœ ์†๊ธ€์”จ ์ˆซ์ž ์ธ์‹์„ ์œ„ํ•ด ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ดํ›„ ์ปดํ“จํ„ฐ ๋น„์ „์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋ฐ”๊พธ๋Š” ๋ฐ ํฐ ์—ญํ• ์„ ํ–ˆ๋‹ค.
๋‹น์‹œ ๋ถ„๋ฅ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋ฐ์ดํ„ฐ์—์„œ ํŠน์ง•์„ ์ถ”์ถœํ•ด ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๋ฅ˜์˜€์œผ๋‚˜, LeNet-5๋Š” ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ํ•„ํ„ฐ ์ž์ฒด๋ฅผ ํ•™์Šต์‹œ์ผœ ์ด๋ฅผ ์ž๋™ํ™”ํ•ด ํ˜์‹ ์ ์ธ ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜์˜€๋‹ค.

LeNet-5์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋Š” ํ˜„๋Œ€์˜ ๋ชจ๋ธ์— ๋น„ํ•ด ๋งค์šฐ ๋‹จ์ˆœํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ CNN ์ดˆ์‹ฌ์ž๋“ค์ด ์ฒ˜์Œ์œผ๋กœ ์ ‘ํ•˜๊ฒŒ ๋˜๋Š” ์ œ๋Œ€๋กœ๋œ CNN ๋ชจ๋ธ์ด๋‹ค.

์š”์ฆ˜ CNN๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ทผ๋ณธ ๋„˜์น˜๋Š” ๊ตฌ์กฐ.
์ด ๊ตฌ์กฐ๋งŒ์œผ๋กœ๋„ 0~9์˜ ์†๊ธ€์”จ๋ฅผ 99% ์ด์ƒ์˜ ์ •ํ™•๋„๋กœ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ˜ผ๋ž€์Šค๋Ÿฌ์šด LeNet-5์˜ Conv3

๊ทธ๋Ÿฌ๋‚˜ LeNet-5๋ฅผ ์กฐ๊ธˆ๋งŒ ๊นŠ๊ฒŒ ์ฐพ์•„๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜๋ฉด, ์š”์ƒํ•œ ๋ ˆ์ด์–ด ํ•˜๋‚˜๊ฐ€ ์šฐ๋ฆฌ์˜ ์ดํ•ด๋ฅผ ๋ฐฉํ•ดํ•œ๋‹ค.
CONV3 ๊ณ„์ธต์€ LeNet-5์˜ ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ๋…ํŠนํ•œ ๋ถ€๋ถ„์ด๊ณ  ํ˜„๋Œ€ CNN์—์„œ๋„ ๊ฑฐ์˜ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

๋ณดํ†ต์˜...

์ผ๋ฐ˜์ ์ธ ํ•ฉ์„ฑ๊ณฑ ๊ณ„์ธต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
๊ทธ๋ฆผ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ, 1์ฑ„๋„์˜ ์ธํ’‹์ด 6๊ฐœ์˜ ์ปค๋„์— ๊ฐ๊ฐ ์—ฐ์‚ฐ๋˜์–ด ์ƒˆ๋กœ์šด 6๊ฐœ์˜ ์•„์›ƒํ’‹์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
์ด๋•Œ, ๊ฐ ํ•„ํ„ฐ๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ์ธํ’‹์„ ์ „๋ถ€ ๋ฐ›์•„๋“ค์ด๊ณ , ํ•ฉ์„ฑ๊ณฑ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ๊ณ„์ธต์€ ์ „์ฒด์ ์ธ ๋Œ€์นญ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

์šฐ๋ฆฌ ๊ธˆ์ชฝ์ด...

๊ทธ๋Ÿฌ๋‚˜, LeNet-5์˜ Conv3 ๊ณ„์ธต์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ์‚ฌ์ด์— ๋น„๋Œ€์นญ ์—ฐ๊ฒฐ ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.
์ด ์—ฐ๊ฒฐ ๋ฐฉ์‹์€ ํ˜„๋Œ€ CNN์—์„œ ์ผ๋ฐ˜์ ์ธ ์™„์ „ ์—ฐ๊ฒฐ ๋ฐฉ์‹์ด ์•„๋‹Œ, ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์กฐํ•ฉ์˜ ์ž…๋ ฅ์„ ํ•™์Šตํ•˜๊ฒŒ ํ•˜๋„๋ก ๊ณ ์•ˆ๋œ ๊ฒƒ์ด๋‹ค.
CONV3 ๊ณ„์ธต์€ 6๊ฐœ์˜ ์ž…๋ ฅ์„ 16๊ฐœ์˜ ์ถœ๋ ฅ์œผ๋กœ ๋น„๋Œ€์นญ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•„ํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ฒŒ๋” ์„ค๊ณ„๋˜์–ด์žˆ๋‹ค.
์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, 0๋ฒˆ ์ธํ’‹์€ ๋‘๋ฒˆ์งธ, ์„ธ๋ฒˆ์งธ ํ•„ํ„ฐ์˜ ์ธํ’‹์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

๋…ผ๋ฌธ์—์„œ ์ œ์‹œํ•œ ๊ทœ์น™์€ ๋‹ค์Œ์˜ ํ‘œ์™€ ๊ฐ™๋‹ค.
์˜ˆ์‹œ๋กœ 0๋ฒˆ ํ•„ํ„ฐ๋Š” ์˜ค์ง 0, 1, 2๋ฒˆ์˜ ์ธํ’‹๋งŒ์„ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ๋”ฐ๋ผ์„œ ํ•„ํ„ฐ์˜ ์ฑ„๋„๋„ 3์ด ๋  ๊ฒƒ์ด๋‹ค.
14๋ฒˆ ํ•„ํ„ฐ๋Š” 0, 2, 3, 5๋ฒˆ์˜ ์ธํ’‹๋งŒ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ํ•„ํ„ฐ์˜ ์ฑ„๋„๋„ 4๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

14๊ฐœ์˜ ์ฑ„๋„์€ ๋‹ค์–‘ํ•œ ๊นŠ์ด๋ฅผ ๊ฐ–์ง€๋งŒ, ๊ฒฐ๊ตญ ๋ชจ๋“  ํ•„ํ„ฐ์˜ ๊ฒฐ๊ณผ๋ฌผ์€ ๋™์ผํ•œ ํฌ๊ธฐ๊ฐ€ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋“ค์€ ๋ฌด์‚ฌํžˆ ๋‹ค์Œ ๋ ˆ์ด์–ด๋กœ ์ „ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ก  ์ž์ฒด๋Š” ์ฒœ์ฒœํžˆ ๋”ฐ๋ผ๊ฐ€๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํ˜ธ๊ธฐ๋กญ๊ฒŒ LeNet-5 ๊ตฌํ˜„์„ ๋„์ „ํ•˜๋Š” ๋งŽ์€ ์ด๋“ค์ด ๋‚œ๊ฐํ•จ์„ ๋А๋‚€๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ด ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐํ•˜๊ณ  ์ผ๋ฐ˜์ ์ธ ํ•ฉ์„ฑ๊ณฑ ๋ ˆ์ด์–ด์™€ ๋™์ผํ•˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‰์น˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

self.conv3 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5, stride=1)

๊ทธ๋Ÿฌ๋‚˜ ๋…ผ๋ฌธ ์ƒ์—์„œ๋„ ํ•ด๋‹น ๋ ˆ์ด์–ด๋ฅผ ์„ค๋ช…ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ณ  ์žˆ๋Š”๋งŒํผ, ์ด๋ฅผ ๊ผญ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

pytourch๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

์ด๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, ํ•ด๋‹น ๋ ˆ์ด์–ด๋ฅผ ๋…ผ๋ฌธ๊ณผ ์™„๋ฒฝํžˆ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ์ธํ„ฐ๋„ท ์ƒ์— ์กด์žฌํ•˜๋Š”์ง€ ์ฐพ์•„๋ณด์•˜๋‹ค.
๋ธ”๋กœ๊ทธ๋Š” ์ฐพ์ง€ ๋ชปํ–ˆ๊ณ , tensorflow๋กœ ๊ตฌํ˜„ํ•œ ํ•œ ๋Œ€ํ•™์›์ƒ ๋ถ„์˜ ์˜์ƒ์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค.

์œ ์ผํ•˜๊ฒŒ ์ฐพ์€ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ LeNet-5 ์„ค๋ช… ์˜์ƒ

์•„์‰ฌ์šด ๊ฒƒ์€ ์‹œ๋Œ€๊ฐ€ ์กฐ๊ธˆ์€ ๋ณ€ํ•˜์—ฌ ํ•™์Šต์šฉ์œผ๋กœ ์ฃผ๋กœ pytourch๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, ๊ตฌํ˜„์˜ ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋‹ค์Œ์€ pytourch๋กœ ๊ตฌํ˜„ํ•œ ์ œ๋Œ€๋กœ๋œ Conv3 ๋ ˆ์ด์–ด์ด๋‹ค.

# Conv3 layer์˜ Rules ์ •์˜
CONV3_RULES = [
    [0, 1, 2], [1, 2, 3], [2, 3, 4],
    [3, 4, 5], [0, 4, 5] , [0, 1, 5],
    [0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5],
    [0, 3, 4, 5], [0, 1, 4, 5], [0, 1, 2, 5],
    [0, 1, 3, 4], [1, 2, 4, 5], [0, 2, 3, 5],
    [0, 1, 2, 3, 4, 5],
]

# Conv3 Layer ๊ตฌํ˜„
class ReNet5Conv3(nn.Module):
    def __init__(self):
        super(ReNet5Conv3, self).__init__()
        self.conv_layers = nn.ModuleList(
            [
                nn.Conv2d(
                    in_channels=len(rules), out_channels=1, kernel_size=5, stride=1
                )
                for rules in CONV3_RULES
            ]
        )

    def forward(self, x):
        conv3_results = []
        for i, rule in enumerate(CONV3_RULES):
            selected_inputs = torch.cat(
                [x[:, idx : idx + 1, :, :] for idx in rule], dim=1
            )
            conv3_results.append(self.conv_layers[i](selected_inputs))
        return torch.cat(conv3_results, dim=1)

ํ•ด๋‹น ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜์—ฌ ์ „์ฒด LeNet-5๋ฅผ ์ •์˜ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
(LeNet-5์˜ ๋…ผ๋ฌธ์„ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, pooling layer์—๋„ ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค.)

# ํ•™์Šต ๊ฐ€๋Šฅํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” SubSampling Layer ๊ตฌํ˜„
class LearnableSubsampling2d(nn.Module):
    def __init__(self, kernel_size, stride=None, num_channels=1):
        super(LearnableSubsampling2d, self).__init__()
        self.kernel_size = kernel_size
        self.stride = stride if stride is not None else kernel_size
        self.weights = nn.Parameter(torch.ones(1, num_channels, 1, 1))
        self.bias = nn.Parameter(torch.zeros(1, num_channels, 1, 1))

    def forward(self, x):
        x = F.avg_pool2d(x, self.kernel_size, self.stride)
        x = x * self.weights + self.bias
        return x
        

# LeNet-5 ๋…ผ๋ฌธ๊ณผ ์ตœ๋Œ€ํ•œ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„
class RealLeNet5(nn.Module):
    def __init__(self, num_classes):
        super(RealLeNet5, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, stride=1)
        self.pool2 = LearnableSubsampling2d(kernel_size=2, stride=2, num_channels=6)
        self.conv3 = ReNet5Conv3()
        self.pool4 = LearnableSubsampling2d(kernel_size=2, stride=2, num_channels=16)
        self.conv5 = nn.Conv2d(
            in_channels=16, out_channels=120, kernel_size=5, stride=1
        )
        self.fc6 = nn.Linear(120, 84)
        self.fc7 = nn.Linear(84, num_classes)

    def forward(self, x):
        x = F.tanh(self.conv1(x))
        x = self.pool2(x)
        x = F.tanh(self.conv3(x))
        x = self.pool4(x)
        x = F.tanh(self.conv5(x))
        x = x.view(x.size(0), -1)
        x = F.tanh(self.fc6(x))
        logits = self.fc7(x)
        return logits


torchinfo.summary(RealLeNet5(NUM_CLASSES), input_size=(1, 1, 32, 32))
๋ชจ๋ธ ์š”์•ฝ๊ณผ ํ•™์Šต ๊ฒฐ๊ณผ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ๋…ผ๋ฌธ๊ณผ ์ผ์น˜ํ•จ

๊ทธ๋Ÿผ ์™œ ์ด๋Ÿฐ ์ด์ƒํ•œ ๋ ˆ์ด์–ด๋ฅผ ์„ค๊ณ„ํ–ˆ์„๊นŒ?

Conv3์˜ ์กด์žฌ ์˜์˜์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ณผ ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๊ณ , ๋น„์ „ ์—ฐ๊ตฌ์‹ค ๊ต์ˆ˜๋‹˜๊ณผ ๋…ผ์˜ํ•œ ํ›„ ์ œ ๋‚˜๋ฆ„๋Œ€๋กœ ๊ฒฐ๋ก ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

์ด๋ ‡๊ฒŒ ๋น„๋Œ€์นญ ์—ฐ๊ฒฐ ๋ฐฉ์‹์„ ํ†ตํ•ด LeNet-5๋Š” ์ „์ฒด ๋„คํŠธ์›Œํฌ์˜ ๋Œ€์นญ์„ฑ์„ ๊นจ๊ณ , ๋” ๋‹ค์–‘ํ•œ ํŠน์ง•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•˜๊ณ  ์žˆ๋‹ค. ํ˜„๋Œ€ CNN์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์ž˜ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†์ง€๋งŒ, ๋“œ๋กญ์•„์›ƒ(dropout)๊ณผ ๊ฐ™์€ ์ •๊ทœํ™” ๊ธฐ๋ฒ•์ด ์ด๋Ÿฌํ•œ ํŠน์„ฑ๊ณผ ๋งฅ์„ ๊ฐ™์ดํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹œ์—๋Š” ๋“œ๋กญ์•„์›ƒ๊ณผ ๊ฐ™์€ ์ •๊ทœํ™” ๊ธฐ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค(์ด๋Š” AlexNet์—์„œ ์ œ์‹œ๋จ). ๋”ฐ๋ผ์„œ, LeNet-5๋Š” ์ด๋Ÿฐ ๋น„๋Œ€์นญ ์—ฐ๊ฒฐ ๋ฐฉ์‹์œผ๋กœ ๋‰ด๋Ÿฐ์˜ ๋‹ค์–‘์„ฑ์„ ์œ ์ง€ํ•˜๋ ค ํ•œ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

LeNet-5์˜ ์—ฐ๊ตฌ์ง„๋“ค์ด ๋‹น์‹œ์— ์ด๋Ÿฐ ๋น„๋Œ€์นญ ๊ตฌ์กฐ๋ฅผ ์–ผ๋งˆ๋‚˜ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ๋Š”์ง€๋ฅผ ์ƒˆ์‚ผ ๋А๋‚„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ๋“œ๋กญ์•„์›ƒ์ด ์•„์ง๋„ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์—์„œ ์›์น™์„ ๊นจ๋Š” ๋‹จ์ˆœํ•œ ์•„์ด๋””์–ด์˜ ๊ฐ•๋ ฅํ•จ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‹ค๊ฐํ–ˆ๋‹ค.

๋!

profile
์„ธ๊ณ„๋Š” ๋‚˜์˜ ํ‘œ์ƒ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 11์›” 15์ผ

์˜ค ์œ ์ตํ•œ ๋‚ด์šฉ ์ž˜ ๋ณด์•˜์Šต๋‹ˆ๋‹ค!
๋ฏผํ‚ค๋‹˜ ์ •๋ฆฌ ์‹ค๋ ฅ์ด ์žฅ๋‚œ ์•„๋‹ˆ์‹ ๋ฐ์š”
์ „์— ๋จธ์‹ ๋Ÿฌ๋‹ ์ˆ˜์—… ๋•Œ ๋“ค์—ˆ๋˜ ๋‚ด์šฉ๋“ค์ด ์–ธ๋œป ๋– ์˜ค๋ฅด๋„ค์š”! ํฌ๋ฏธํ•˜๊ฒŒ ์–ธ๋œป...

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ