I understand that the blockchain is a decentralized database, however what I don't understand is who runs the bitcoin software. Is this also decentralized? There has to be some form of "backend" to run the checks and balances?
Being a decentralised consensus, with all nodes aware of all the rules and all acting in lock step, there needs to be no centralised controller for anything. Every participant using Bitcoin is responsible for coming to their own conclusion about the state of the network, making sure every piece of data is correctly formed and executed according to the consensus rules they are aware of. Should everything be working correctly, the state they come to will match that of their peers without ever having to consult an authority.
There is no centralized backend.
The software that each user runs enforces the rules.
Whilst there is nothing stopping you from modifying the source code and trying to change those rules, all of the other nodes would reject anything invalid that your modified node tried to change.
(On the flip side of that, if enough people did agree to the rulechange that you implemented in your version, and they started running your version as well, then you could indeed change the rules that govern Bitcoin. It gets tricky from here but to simplify, on average you would need to get over 50% of the people running the software to change to your version for the new rules to be enforced.
When new coins are created, it's not because any centralized software issued them. Upon submitting a correct solution to the current problem to all of the nodes that the solver is connected to, all of those nodes will accept the solution, adding it to their blockchain (causing the coins to be created), and passing the solution onto their nodes as well. Within a short period of time, all nodes (running legit software that all agree on the same rules) will recognize the new solution, adding it to their blockchain.
If multiple solutions are created at the same time, some nodes will accept one and some nodes will accept another, creating a temporary fork. This is quickly resolved by the network, where ultimately one of the solutions (and its fork) will become the accepted one, and the other fork will be abandoned. This is why places often require a transaction to be x blocks back in the chain, to give a certain amount of time for any temporary forks to sort themselves out. As a solution becomes older and older, and more ingrained into the blockchain, it becomes more and more likely that it will never be part of an abandoned fork.