Multiplication Exercise Generator
You're using functions, that's good. But, your program would be easier to understand, and better, if it didn't.

As a rule of thumb; don't put things in global scope.
Whether it be via global or by not putting your code in a function.
This is the global scope becomes un-reliable and you proceed to not know what your code is doing.

I would say that you should move check_answer into your while loop.
This is as rather than using generate_question you should use break.
This at the moment would end the program, but if you add another while True loop you can get the same functionality.
This is better as then you are starting to separate generating a question and checking if it's correct.
As we now only rely on the outer while to correctly setup the inner while, rather than changing globals to get things to work.

And so I'd use:

from random import randrange

def generate_number():
    return randrange(1, 13)

def main():
    while True:
        num1, num2 = generate_number(), generate_number()
        answer = num1 * num2
        print "What is %d times %d?" % (num1, num2)
        while True:
            user_input = int(raw_input("Answer: "))
            if user_input == answer:
                print "Very good!"
                break
            else:
                print "Try again!"


You should notice that this is your code. With a second while loop and a break.
But you should notice it's easier to understand what it's doing, when coming as a third party.

As at first, I didn't notice your code asks more than one question.



Just so you know you're already using a tuple! In print "What is %d times %d?" % (num1, num2).
The (num1, num2) is creating a tuple.
If you decided to use this rather than num1 and num2 then you would change num1 to num[0] and num2 to num[1].
This is as in most programming languages they start lists with zero rather than one.
Lists actually work the same way as tuples, but are created using [] rather than ().
The only difference is you can change num[0] when using a list, but you can't with a tuple.

You should also learn what try-except are. If I enter abc rather than 123 into your program it would exit abruptly.
What these do is try to run the code, if an error occurs run the except code.
But I'll warn you now, never use a 'bare except'. Which is an except that doesn't say what it's protecting against.
This is as if the code raises a different error than you'll run code as if it were another, which can hide bugs.
And makes finding those bugs really hard to find.

And so I'd further change the code to use:

from random import randrange

def generate_number():
    return randrange(1, 13)

def main():
    while True:
        num1, num2 = generate_number(), generate_number()
        answer = num1 * num2
        print "What is %d times %d?" % (num1, num2)
        while True:
            try:
                user_input = int(raw_input("Answer: "))
            except ValueError:
                print('That is not a valid number.')
                continue
            if user_input == answer:
                print "Very good!"
                break
            else:
                print "Try again!"